python 自动化selenium

目录

一、安装

二、参数说明

2.1开启浏览器

2.2 定位元素

2.2.1 id

 2.2.2 name

2.2.3 class

2.2.4 tag_name

2.2.7xpath

2.3 获取标签内容

2.4 执行js脚本

2.5模拟回车键

2.6 动态等待时间

 2.7同时开启多个浏览器

案例

案例一、团课自动签到

综合实例

多线程打开多个浏览器

三、只登录一次(其余的driver跳过登录   复制 cookie实现跳过登录)

四、playwright(自动录制)

总结

遇到的问题:

问题1:当点击  点击创建了一个新标签页时需要将 selenium 切换到当前的标签页中

问题2: 当操作 iframe 中的内容


一、安装

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")

a标签可用

driver.find_element(By.LINK_TEXT,"登录")//点击登录

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()  # 切换回主文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值