目录
三、只登录一次(其余的driver跳过登录 复制 cookie实现跳过登录)
问题1:当点击 点击创建了一个新标签页时需要将 selenium 切换到当前的标签页中
一、安装
pip install selenium
使用 WebDriver 自动执行 Microsoft Edge - Microsoft Edge Development | Microsoft Learn
二、参数说明
2.1开启浏览器
方式1
from selenium.webdriver import Chrome#导入浏览器的包
#打开浏览器
web=Chrome()
#打开浏览器,请求网站
web.get('https://www.baidu.com')
方式二
#from selenium import webdriver
from selenium.webdriver import Chrome#导入浏览器的包
#打开浏览器
web =webdriver.Chrome()
#打开浏览器,请求网站
web.get('https://www.baidu.com')
# 将浏览器设置为全屏
web.maximize_window()
from selenium import webdriver
# #实例化一个浏览器对象
# bro = webdriver.Chrome(executable_path='./chromedriver.exe')#也可以找到浏览器安装包的可执行路径
# #发起一个get请求
# bro.get(url='https://www.baidu.com')
#例如
from selenium import webdriver
browser = webdriver.Chrome(executable_path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver_X64.exe')
browser.get('http://www.baidu.com')
后台打开浏览器
#后台开启浏览器
def openChrome():
# 加启动配置
option = webdriver.ChromeOptions()
option.add_argument('headless')
# 打开chrome浏览器
driver = webdriver.Chrome(chrome_options=option)
return driver
2.2 定位元素
selenium模块中的find_element_by_id方法无法使用
2.2.1 id
在网站中有很多的id,我们可以通过找到这些id来帮助我们定位网页中的元素,但是id定位有缺点就是id元素往往是单一个存在,如果我们需要定位多个id的话id定位就不好帮助我们进行定位。
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 创建Chrome参数对象
opt.headless = True # 把Chrome设置成可视化无界面模式,windows/Linux 皆可
driver = webdriver.Chrome()
driver.get("网址")
a1 = driver.find_element(By.ID,'id_username')
2.2.2 name
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 创建Chrome参数对象
opt.headless = True # 把Chrome设置成可视化无界面模式,windows/Linux 皆可
driver = webdriver.Chrome()
driver.get("网址")
driver.find_element(By.NAME,"username").send_keys("1234567879")
driver.find_element(By.NAME,"password").send_keys("123456")
2.2.3 class
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 创建Chrome参数对象
opt.headless = True # 把Chrome设置成可视化无界面模式,windows/Linux 皆可
driver = webdriver.Chrome()
driver.get("网址")
driver.find_element(By.CLASS_NAME,"Validform_error")
2.2.4 tag_name
driver.find_element(By.TAG_NAME,"input")
2.2.5 link_text
a标签可用
driver.find_element(By.LINK_TEXT,"登录")//点击登录
2.2.6partial_link
a标签可用
driver.find_element(By.PARTIAL_LINK_TEXT,"登")//模糊匹配带“登”字的链接
2.2.7xpath
driver.find_element(By.XPATH,'/html/body/div/p[1]')//根据元素的路径查找
driver.find_element(By.XPATH,'//table/body/div/p[1]')//根据元素的路径查找
2.3 获取标签内容
a = driver.find_element(By.CLASS_NAME, 'jifen').get_attribute('innerHTML')
2.4 执行js脚本
js = "this.document.getElementsByClassName(\'topindex2\')"
# 调用js脚本
driver.execute_script(js)
get_attribute()还有get_attribute("innerHTML") 和get_attribute("outerHTML")方法
实践得出,get_attribute("textContent")和get_attribute("innerHTML")可获得链接文本
get_attribute("outerHTML")可获得a链接全部信息,如下图标出的 <a href="#modal" data-toggle="modal" data-url="/admin/user/2964/avatar">修改用户头像</a>
另外,对 a 标签中的每个属性进行 get_attribute 操作获取,如
element.get_attribute("class")
element.get_attribute("href")
elemnet.get_attribute("date-url")
2.5模拟回车键
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://cn.bing.com/")
element = driver.a1 = driver.find_element(By.ID,'sb_form_q')
element.send_keys('百度')
time.sleep(2)
print("开始回车按钮")
element.send_keys(Keys.RETURN)
print("回车按钮结束")
time.sleep(20)
2.6 动态等待时间
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
try:
# 等待六十秒
WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.ID, 'ID')))
except exceptions.TimeoutException:
driver.quit()
2.7同时开启多个浏览器
from selenium import webdriver
import threading
def open_browser(url):
driver = webdriver.Chrome()
driver.get(url)
# 在这里添加你需要执行的操作,例如获取页面元素等
driver.quit()
if __name__ == "__main__":
url = "https://cn.bing.com/"
threads = []
for i in range(3):
t = threading.Thread(target=open_browser, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
print("所有浏览器已关闭")
案例
from selenium import webdriver
import threading
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
def open_browser(url,data):
driver = webdriver.Chrome()
driver.get(url)
# 在这里添加你需要执行的操作,例如获取页面元素等
time.sleep(2)
for d in data:
a1 = driver.find_element(By.ID, 'sb_form_q')
# 填写内容
# import pdb;pdb.set_trace()
a1.send_keys(d[0])
time.sleep(3)
# 点击搜索
a1.send_keys(Keys.RETURN)
time.sleep(30)
time.sleep(50)
driver.quit()
def split_list(lst, n):
avg = len(lst) // n
remainder = len(lst) % n
result = []
i = 0
for _ in range(n):
end = i + avg + (1 if remainder > 0 else 0)
result.append(lst[i:end])
i = end
if remainder > 0:
remainder -= 1
return result
if __name__ == "__main__":
url = "https://cn.bing.com/"
threads = []
number_of_browsers = 3
data_list = [
['百度'],
['阿里'],
['搜狗'],
]
data_list = split_list(data_list,number_of_browsers)
# 将数据拆分为三份
data1 = data_list[0:len(data_list):1]
for i in range(number_of_browsers):
data = data_list[i]
t = threading.Thread(target=open_browser, args=(url,data))
threads.append(t)
t.start()
for t in threads:
t.join()
print("所有浏览器已关闭")
案例一、团课自动签到
# coding=utf-8
'''
@date:2023/3/13 17:26
@email:2654152420@qq.com
@author:小纯
@Content: 自动打卡
pip install selenium
'''
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
import os
import sys
# browser = webdriver.Firefox() # 启动Firefox浏览器:
# browser = webdriver.Chrome() # 启动Chrome浏览器:
# browser = webdriver.Ie() # 启动Ie浏览器:
# browser = webdriver.Edge() # 启动Edge:
# http://home.yngqt.org.cn/qndxx/index.aspx
def open_browser_url(parameter_config):
# 选择Chrome浏览器
driver = webdriver.Edge()
# 这是我学校的打卡网页,需自行修改
driver.get(parameter_config.get('url'))
# 这两步把操作界面切换到新打开的浏览器页面
# now_handle = driver.current_window_handle
# driver.switch_to.window(now_handle)
# 定位元素
# 点击登陆
driver.find_element(By.CLASS_NAME, 'tan-login2').click()
# 填写账号密码
driver.find_element(By.ID, 'login_username').send_keys(parameter_config.get('login').get('username'))
driver.find_element(By.ID, 'login_password').send_keys(parameter_config.get('login').get('paw'))
# 点击登陆
driver.find_element(By.ID,'login_btn').click()
sleep(2)# 等待5秒
# 点击确定
driver.find_element(By.CLASS_NAME,'layui-layer-btn0').click()
# 查看学习记录
driver.find_element(By.CLASS_NAME,'cha').click()
# 获取签到前的分数
# 获取签到前的分数
write_log("=====================华丽分割线===============================")
sign_in_behind = driver.find_element(By.CLASS_NAME, 'jifen').get_attribute('innerHTML')
write_log(sign_in_behind)
# 签到
driver.find_element(By.CLASS_NAME,'jiao').click()
# 关闭签到成功按钮
sleep(2) # 休息一下 layui-layer-btn0
driver.find_element(By.CLASS_NAME, 'layui-layer-btn0').click()
# 获取签到后的分数
sign_in_front = driver.find_element(By.CLASS_NAME, 'jifen').get_attribute('innerHTML')
# 延时30秒
write_log(sign_in_front)
sleep(60)# 休息一下
def write_log(msg):
log_name = "云南共青团团课签到日志"
dirname,fileName = os.path.split(os.path.abspath(sys.argv[0]))
path = os.path.realpath(sys.argv[0])
# 在 dirname 写入日志文件
desktop_path = dirname +'/' # 新创建的txt文件的存放路径
# 创建文件
full_path = desktop_path + log_name + '.log' # 也可以创建一个.doc的word文档
file = open(full_path, 'a+', encoding='utf-8')
file.write(f"{msg}\n")
# http://home.yngqt.org.cn/qndxx/index.aspx
# http://127.0.0.1:8005
if __name__ == "__main__":
parameter_config = {
"url":"http://home.yngqt.org.cn/qndxx/index.aspx",# 开启浏览器访问的地址
"login":{
'username':' 0000',
'paw':'0000000'
},
}
open_browser_url(parameter_config)
pass
# coding=utf-8
'''
@date:2023/3/21 8:43
@email:2654152420@qq.com
@author:小纯
@Content: 自动化处理工具
'''
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
import os
import sys
from .models import *
import logging
import celery
import time
from mybasicsystem.celery import app
from utils import Result as Res
logger = logging.getLogger(__name__)
def run(ids):
# 获取需要打开的浏览器类型
run_list = ZdhRoot.objects.filter(pk__in=ids).values()
print(run_list)
if not run_list:
return False
for rl in run_list:
if rl.get('is_asynchronous') == '1':
try:
result = asynch_task(rl)
print(result, "执行异步任务")
# ZdhRoot.objects.filter(pk=rl.get('id')).update(asyn_id=result.id)
# log_str = ""
# ZdhLog.objects.create(**{'zdh':ZdhRoot.objects.filter(pk=rl.get('id')).first(),'log_str':log_str})
except Exception as e:
print("异步执行出错")
else:
not_asynch_task(rl)
ZdhRoot.objects.filter(pk=rl.get('id')).update(asyn_id='')
return Res.ok(msg="正在异步执行,请稍后", data=None)
@app.task
def asynch_task(rl):
print("异步执行", rl)
open_browse(rl)
def not_asynch_task(rl):
print("非异步任务", rl)
open_browse(rl)
# 打开浏览器
def open_browse(rl):
driver = None
if rl.get('open_browser') == 'Edge':
try:
driver = webdriver.Edge()
except Exception as e:
print("打开Edge浏览器错误")
browse_try()
elif rl.get('open_browser') == 'Firefox':
try:
driver = webdriver.Firefox()
except Exception as e:
print("打开Edge浏览器错误")
browse_try()
elif rl.get('open_browser') == 'Chrome':
try:
driver = webdriver.Chrome()
except Exception as e:
print("打开Edge浏览器错误")
browse_try()
if driver:
if rl.get('open_url'):
driver.get(rl.get('open_url'))
cauo_zuo(driver, rl)
# 打开浏览器异常处理
def browse_try():
browser = None
try:
browser = webdriver.Edge()
except Exception as e:
print("打开Edge浏览器错误")
try:
browser = webdriver.Firefox()
except Exception as e:
print("打开Firefox浏览器错误")
try:
browser = webdriver.Chrome()
except Exception as e:
print("打开Chrome浏览器错误")
try:
browser = webdriver.Ie()
except Exception as e:
print("打开 Ie 浏览器错误")
return browser
# 操作 内容
def cauo_zuo(driver, rl):
property_list = ZdhProcedure.objects.filter(root_id=rl.get("id")).order_by('order').values()
continue_carry_out = False
for pro_index in property_list:
if pro_index.get("operate") == "点击":
try:
click_fun(driver, pro_index)
except Exception as e:
continue_carry_out = True
logger.error(msg=f"错误的 点击 事件{e}")
elif pro_index.get("operate") == "输入":
try:
intg = input_form(driver, pro_index)
if not intg:
continue_carry_out = True
except Exception as e:
continue_carry_out = True
logger.error(msg=f"错误的 输入 {e}")
elif pro_index.get("operate") == "记录日志":
try:
jilurizhi(driver, pro_index, rl)
except Exception as e:
continue_carry_out = True
logger.error(msg=f"错误的 记录日志 {e}")
print("等待时间", (pro_index.get('wait_time')))
sleep(pro_index.get('wait_time'))
if continue_carry_out:
logger.error(msg=f"执行错误:{pro_index.get('id')},{pro_index.get('procedure_name')},")
return
# 点击
def click_fun(driver, pro_index):
try:
driver.find_element(html_get_type(pro_index.get('scour_type')), pro_index.get("scour_value")).click()
para_list = ZdhParameter.objects.filter(pd_id=pro_index.get('id')).values(
'id', 'parameter_type',
'key_str', 'value_str'
, 'pd_id', 'remarks'
)
xie_log(pro_index.get('id'),f"正常: {pro_index.get('id')} , {pro_index.get('procedure_name')}")
for pa_index in para_list:
driver.find_element(html_get_type(pa_index.get('parameter_type')), pa_index.get("key_str")).click()
xie_log(pro_index.get('id'), f"正常: {pro_index.get('id')} , {pro_index.get('procedure_name')}")
except Exception as e:
logger.error(msg=f"错误的点击事件:{e}")
xie_log(pro_index.get('id'), f" 错误: {pro_index.get('id')} , {pro_index.get('procedure_name')},{html_get_type(pro_index.get('scour_type'))}")
# 表单填写
def input_form(driver, pro_index):
para_list = ZdhParameter.objects.filter(pd_id=pro_index.get('id')).values(
'id', 'parameter_type',
'key_str', 'value_str'
, 'pd_id', 'remarks'
)
for pa_index in para_list:
try:
driver.find_element(html_get_type(pa_index.get('parameter_type')), pa_index.get('key_str')).send_keys(
pa_index.get('value_str'))
xie_log(pro_index.get('id'), f"正常:当前运行==》{pa_index.get('remarks')},查找方式{pa_index.get('parameter_type')},"
f"查找组件{ pa_index.get('key_str')},参数 {pa_index.get('value_str')} ")
except Exception as e:
logger.error(msg=f"错误:的表单填写{e}")
xie_log(pro_index.get('id'), f"错误:当前运行出错==》{pa_index.get('remarks')},"
f"查找方式{html_get_type(pa_index.get('parameter_type'))},"
f"查找组件{pa_index.get('key_str')},"
f"参数 {pa_index.get('value_str')} ")
return False
return True
# 日志记录
def jilurizhi(driver, pro_index,rl):
try:
sign_in_behind = driver.find_element(html_get_type(pro_index.get('scour_type')),pro_index.get('scour_value')).get_attribute('innerHTML')
xie_log(pro_index.get('id'), "正常:"+sign_in_behind)
logger.info(msg=f"自动化名称:{rl.get('zdh_name')},自动化流程名称{pro_index.get('procedure_name')}")
except Exception as e:
print(f"日志记录出现错误{e}")
xie_log(pro_index.get('id'), f"错误:运行{pro_index.get('id')},{pro_index.get('procedure_name')}")
# 写入日志
def xie_log(pro_id, logs_str):
logger.info(msg=f"日志内容{pro_id}:{logs_str}")
ZdhProcedure.objects.filter(pk=pro_id).update(log=logs_str)
# 校验是否可行
def jioayan(driver, pro_index):
pass
# 获取类型
def html_get_type(zfc):
if zfc == 'ID':
return By.ID
elif zfc == 'CLASS_NAME':
return By.CLASS_NAME
elif zfc == 'XPATH':
return By.XPATH
elif zfc == 'LINK_TEXT':
return By.LINK_TEXT
elif zfc == 'PARTIAL_LINK_TEXT':
return By.PARTIAL_LINK_TEXT
elif zfc == 'TAG_NAME':
return By.TAG_NAME
elif zfc == 'CSS_SELECTOR':
return By.CSS_SELECTOR
elif zfc == 'NAME':
return By.NAME
综合实例
# coding=utf-8
'''
@date:2023/3/16 10:33
@email:2654152420@qq.com
@author:小纯
@Content:
pip install selenium
'''
import time
import uuid
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
import os
import sys
from selenium.webdriver.support.select import Select
import traceback
# browser = webdriver.Firefox() # 启动Firefox浏览器:
# browser = webdriver.Chrome() # 启动Chrome浏览器:
# browser = webdriver.Ie() # 启动Ie浏览器:
# browser = webdriver.Edge() # 启动Edge:
# http://home.yngqt.org.cn/qndxx/index.aspx
def open_browser_url(parameter_config):
# 选择Chrome浏览器
driver = webdriver.Edge()
driver.maximize_window()
# 这是我学校的打卡网页,需自行修改
driver.get(parameter_config.get('url'))
# 这两步把操作界面切换到新打开的浏览器页面
# now_handle = driver.current_window_handle
# driver.switch_to.window(now_handle)
# 定位元素 登陆签到
try:
# 点击登陆
driver.find_element(By.CLASS_NAME, 'tan-login2').click()
# 填写账号密码
driver.find_element(By.ID, 'login_username').send_keys(parameter_config.get('login').get('username'))
driver.find_element(By.ID, 'login_password').send_keys(parameter_config.get('login').get('paw'))
# 点击登陆
driver.find_element(By.ID, 'login_btn').click()
sleep(2) # 等待5秒
# 点击确定
driver.find_element(By.CLASS_NAME, 'layui-layer-btn0').click()
# 点击 查看学习记录
driver.find_element(By.CLASS_NAME, 'cha').click()
except Exception as e:
print(f"====登陆异常 =================={e}")
# 获取签到前的分数
try:
# 获取签到前的分数
write_log("=====================华丽分割线===============================")
sign_in_behind = driver.find_element(By.CLASS_NAME, 'jifen').get_attribute('innerHTML')
write_log(sign_in_behind)
# 签到
driver.find_element(By.CLASS_NAME, 'jiao').click()
# 关闭签到成功按钮
sleep(2) # 休息一下 layui-layer-btn0
driver.find_element(By.CLASS_NAME, 'layui-layer-btn0').click()
# 获取签到后的分数
sign_in_front = driver.find_element(By.CLASS_NAME, 'jifen').get_attribute('innerHTML')
# 延时30秒
write_log(sign_in_front)
sleep(1) # 休息一下
except Exception as e:
print("点击签到异常=======================",e)
# 查看视屏
try:
''' 点击最新一期的学习视频 '''
driver.find_element(By.CLASS_NAME, 'jltl').click()
except Exception as e:
print(f"===点击视频异常==={e}")
# 判断选择州市
sleep(5)
# 切换到新页面
driver = switch_new_page(driver)
new_qi_name = driver.find_element(By.TAG_NAME, 'h1').get_attribute('innerHTML')
# 操作新页面
try:
# 切换到 iframe 页面
iframe = driver.find_element(By.TAG_NAME, "iframe") # 获取class为example的iframe元素
driver.switch_to.frame(iframe) # 切换到该iframe中
# 选择
select_box = driver.find_element(By.ID, "province") # 获取id为province的select下拉框
select = Select(select_box) # 转换为Select对象
select.select_by_visible_text(parameter_config.get('login').get('province')) # 选中value为2的选项
sleep(3)
# 选择
select_box = driver.find_element(By.ID, "city") # 获取id为province的select下拉框
select = Select(select_box) # 转换为Select对象
select.select_by_visible_text(parameter_config.get('login').get('city')) # 选中value为2的选项
# 确定州市
sleep(1)
driver.find_element(By.CLASS_NAME, 'sure').click()
sleep(10)
# 点击开始学习
driver.find_element(By.CLASS_NAME, 'on').click()
for x in range(0,parameter_config.get('login').get('time_s')):# 十分钟时间 看视频
sleep(1)
# 每次 查看做题需要等待 6 分钟
try:
xuanze_ti(driver,x)
except Exception as e:
print("没有找到题目")
# 退出 iframe 页面
driver.switch_to.default_content() # 切换回主文档
except Exception as e:
print(f'存在异常==>{e}')
traceback.print_exc()
# 保存团课截图
y_m_d = time.strftime("%Y-%m-%d%H%M%S", time.localtime())
file_name = f"{y_m_d}-{new_qi_name}-{parameter_config.get('login').get('username')}团课截图.png"
driver.save_screenshot(file_name)
print(f"截图文件已经为你保存:{y_m_d}-{new_qi_name}-{parameter_config.get('login').get('username')}团课截图.png")
# 切换回原页面
driver = return_original_pages(driver)
print("等待结束")
sleep(300)
# 关闭浏览器
driver.close()
def write_log(msg):
log_name = "云南共青团团课签到日志"
dirname, fileName = os.path.split(os.path.abspath(sys.argv[0]))
path = os.path.realpath(sys.argv[0])
# 在 dirname 写入日志文件
desktop_path = 'D:/MyLog/' # 新创建的txt文件的存放路径
# 创建文件
full_path = desktop_path + log_name + '.log' # 也可以创建一个.doc的word文档
file = open(full_path, 'a+', encoding='utf-8')
file.write(f"{msg}\n")
# 切换到新标签页
def switch_new_page(driver):
# 切换到新页面
driver.switch_to.window(driver.window_handles[-1])
return driver
# 返回原始页面
def return_original_pages(driver):
# 切换回原页面
driver.switch_to.window(driver.window_handles[0])
return driver
# 做题
def xuanze_ti(driver,x):
try:
# 点击选项
driver.find_element(By.CLASS_NAME, 'option').click()
# 点击 确定 按钮
driver.find_element(By.CLASS_NAME, 'button').click()
# 点击继续学习 continue
sleep(5)
driver.find_element(By.CLASS_NAME, 'continue').click()
print(f"找到了题目,正在为你选择,已经为你全选{x}")
return True
except Exception as e:
if x<1:
print(f"暂时没有找到需要做的题目,请等待")
return False
# 判断是否看完 display: block
def panduan_shi_wan(driver,new_qi_name):
try:
driver.find_element(By.CLASS_NAME,'topindex1')
print("视频已经看完")
# 截取图片 保存图片
ing_name = uuid.uuid4()
y_m_d = time.strftime("%Y-%m-%d%H%M%S", time.localtime())
file_name = f"{y_m_d}-{new_qi_name}-{parameter_config.get('login').get('username')}团课截图.png"
driver.save_screenshot(file_name)
return True
except Exception as e:
return False
# 判断有无网络
def panduan_wabgluo():
res = os.system("ping baidu.com -n 1")
return True if res == 0 else False
def my_config(parameter_config=None):
if not parameter_config:
parameter_config = {
"url": "http://home.yngqt.org.cn/qndxx/index.aspx", # 开启浏览器访问的地址
"login": {
'username': '00000', # 用户名
'paw': '00000', # 密码
'province': 'XXX省', # 选择县
'city': 'XXX市', # 选择市
'img_sva_path': '', # 保存路径
'time_s': 500, # 设置视频时长,保证截图为最后一张图片 秒
},
}
print("==============默认参数==============================")
print('账号:', parameter_config.get('login').get('username'))
print('密码:', parameter_config.get('login').get('paw'))
print('省:', parameter_config.get('login').get('province'))
print('市:', parameter_config.get('login').get('city'))
print('时长:', f"{parameter_config.get('login').get('time_s')}S")
print("===================================================")
is_inputs = input("是否需要修改参数Y/N:")
if is_inputs.upper() != 'N':
user_name = input("请输入账号:")
paw = input("请输入密码:")
province = input("请输入-省:")
city = input("请输入-市:")
time_s = input("请输入大致时间长度方便截取图片(秒)默认为500S:")
if user_name:
parameter_config['login']['username'] = user_name
if paw:
parameter_config['login']['paw'] = paw
if province:
parameter_config['login']['province'] = province
if city:
parameter_config['login']['city'] = city
if time_s:
parameter_config['login']['time_s'] = int(time_s)
que_reng = input("确认信息Y/N:")
if que_reng.upper() == 'N':
my_config(parameter_config=parameter_config)
else:
return parameter_config
else:
return parameter_config
# http://home.yngqt.org.cn/qndxx/index.aspx
if __name__ == "__main__":
parameter_config = my_config(parameter_config=None)
is_run = False
for x in range(0, 100):
if panduan_wabgluo() and is_run == False:
open_browser_url(parameter_config)
is_run = True
else:
print("网络未链接,请检查网络连接状态。。。。")
sleep(6)
if is_run:
break
多线程打开多个浏览器
from selenium import webdriver
import threading
def open_browser(url):
driver = webdriver.Chrome()
driver.get(url)
# 在这里添加你需要执行的操作,例如获取页面元素等
driver.quit()
if __name__ == "__main__":
url = "https://cn.bing.com/"
threads = []
for i in range(3):
t = threading.Thread(target=open_browser, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
print("所有浏览器已关闭")
三、只登录一次(其余的driver跳过登录 复制 cookie实现跳过登录)
# coding=utf-8
'''
@date:2023/11/23 8:41
@mail:xiaochun235@qq.com
@Content:
'''
import os
import time
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common import exceptions
EXE_BASEDIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
def isLogin(driver):
''' 判断是否 登录'''
latency_time = 60 # 设置等待时长
is_wait = True
is_login = False
while is_wait:
try:
isIndex = WebDriverWait(driver, 1).until(EC.visibility_of_element_located((By.CLASS_NAME, 'navbar')))
if isIndex:
is_login = True
is_wait = False
except exceptions.TimeoutException:
latency_time -= 1
print("等待时长", latency_time)
if latency_time <=0:
is_wait = False
return is_login
def create_login_new_driver(driver):
''' 创建新的已经登录后的 driver '''
time.sleep(20) # 等待在 初始浏览器中 运行20s
# 获取当前的 url 内容
current_url = driver.current_url
# 获取 cookies 信息
cookies = driver.get_cookies()
# 创建 新的 driver
new_driver = webdriver.Chrome()
new_driver.maximize_window()
# 先跳转到登录页面
new_driver.get("https://vue.ruoyi.vip/login")
# 添加 cookies 内容
for cookie in cookies:
# 去除不用的 cookie信息
# if 'httpOnly' in cookie:
# del cookie['httpOnly']
new_driver.add_cookie(cookie)
new_driver.get(current_url)
time.sleep(60)
return new_driver
def main():
opt = ChromeOptions() # 创建Chrome参数对象
opt.headless = False # 把Chrome设置成可视化无界面模式,windows/Linux 皆可
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://vue.ruoyi.vip/login")
is_login = isLogin(driver)
if is_login:
create_login_new_driver(driver)
time.sleep(1000)
else:
# 退出
driver.quit()
if __name__=='__main__':
main()
四、playwright(自动录制)
总结
遇到的问题:
问题1:当点击 点击创建了一个新标签页时需要将 selenium 切换到当前的标签页中
# 切换到新页面
driver.switch_to.window(driver.window_handles[-1])
# 。。。。。 在新标签页中的操作
# 切换回原页面
driver.switch_to.window(driver.window_handles[0])
# 继续在原页面操作
问题2: 当操作 iframe 中的内容
from selenium.webdriver.support.select import Select
# 判断是否已经存在
iframe = driver.find_element(By.TAG_NAME, "iframe") # 获取class为example的iframe元素
driver.switch_to.frame(iframe) # 切换到该iframe中
select_box = driver.find_element(By.ID, "province") # 获取id为province的select下拉框
# select 选择
select = Select(select_box) # 转换为Select对象
select.select_by_value("2") # 选中value为2的选项
driver.switch_to.default_content() # 切换回主文档