当前位置: 首页 > news >正文

Web自动化中多浏览器并发

一、背景

1、当自动化用例比较多时,执行需要很长时间,为了提高执行效率可以将用例分配到多个浏览器执行

2、兼容性测试,在多个不同的浏览器上执行自动化用例,测试这些用例在不同浏览器上是否正常

二、设计方案

1、使用pytest-xdist插件

2、执行用例的时候,框架需要知道执行哪些浏览器

  • 可以在pytest执行时,指定一个命令行参数,--browsers,表示要执行的浏览器名称,多个浏览器用逗号分隔
--browsers=chrome,chrome
或者
--browsers=chrome,edge
  • 定义命令行执行参数,需要进行代码处理才会被pytest识别
    # 这是pytest的内置钩子函数,名称是固定的
    # 可以用来自定义命令行参数
    def pytest_addoption(parser):
        parser.addoption('--browsers',action='store')
  • 如何将用例分配给不同进程
  1. 得到多个浏览器名称,字符串为"chrome,chrome",为了更好的处理,可以将字符串转化为列表["chrome","chrome"]
  2. 第一步得到列表有索引,索引从0开始,进程id(gw0,gw1,gw2......),刚好对应上索引,所以我们可以按照索引的位置去对应传递浏览器名称到对应的进程上
  3. 解析进程id里的数字,和列表索引对应起来,获取对应索引代表浏览器名称
  4. 代码在conftest实现
    # 获取浏览器名称
    @pytest.fixture(scope='session',autouse=True)
    def get_browser(request,worker_id):
        # 得到--browsers对应的值
        browsers = request.config.getoption('--browsers')
        if browsers:
            # 'chrome,chrome'
            browsers_list = browsers.split(',') # ['chrome','chrome']
            if worker_id=='master':
                return browsers_list[0]
            else:
                # gw0/gw1/gw2...
                index = int(worker_id[2:])
                return browsers_list[index]
        else:
            return 'chrome'
  5. 将得到的浏览器名称传递到初始化代码
    @pytest.fixture(scope='session',autouse=True)
    def init_driver(get_browser):
        browser = get_browser
        DriverOperate.globalDriverOperate = DriverOperate(browser=browser)
        DriverOperate.globalDriverOperate.get('url')
        BuyerLoginActions().buyer_login(username='username',password='password')
        yield
        DriverOperate.globalDriverOperate.quit()
  • 分配不同的用例给不同的浏览器
  1. 分配不同的用例给不同的浏览器,其实是分配用例给不同的进程,pytest-xdist默认分配用例的规则是在测试用例的维度,但是这种默认分配机制会打乱我们用例之间的关联,因此不建议使用默认分配方式
  2. 如果想提升执行效率,可以按照文件进行分配,pytest-xdist有一个参数,--dist=loadfile,如果想执行兼容性测试,那么每个浏览器都需要执行所有用例,可以用--dist=each
  • 多进程并发数据冲突问题
  1. 数据冲突主要是使用的用户是同一个,因此我们可以给不同的进程分配不同的用户,就可以解决这个问题
        if worker_id=='master':
            BuyerLoginActions().buyer_login(username=usernames[0],password=pwd_list[0])
        else:
            index = int(worker_id[2:])
            BuyerLoginActions().buyer_login(username=usernames[index], password=pwd_list[index])

相关文章:

  • IO的概念和标准IO函数
  • 用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录
  • 实训任务1.3 使用eNSP搭建基础网络
  • 如何解析API返回的JSON数据?
  • c++上课题目
  • GEE:计算长时间序列NPP与NDVI之间的相关系数
  • Vue3 TransitionGroup组件深入解析:结合Element Plus实践指南
  • iOS逆向工程专栏 第13篇:iOS动态分析基础
  • golang实现读取excel文件并转换为JSON格式
  • 51单片机编程学习笔记——74HC138译码器
  • 通用网盘客户端(基于webdav协议)
  • 《JavaScript解题秘籍:力扣队列与栈的高效解题策略》
  • 【Mac】2025-MacOS系统下常用的开发环境配置
  • 私有云基础架构
  • 全面了解机器学习:回归、分类、分割与检测任务
  • OpenCV:从入门到实战的全方位指南
  • DeepSeek助力学术写作:150个提示词解读
  • Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)
  • HarmonyOS NEXT开发进阶(十一):应用层架构介绍
  • selenium用例执行过程采集操作形成测试报告上的回复
  • 国家发改委:不断完善稳就业稳经济的政策工具箱,确保必要时能够及时出台实施
  • 连续两个交易日涨停,华夏幸福:生产经营活动正常,不存在影响股价波动的重大事宜
  • 山西晋城一网红徒步野游线路据传发生驴友坠崖,当地已宣布封路
  • 上千螺母引发的枪支散件案:五金厂老板的儿子被诉,律师作无罪辩护
  • 沧州盐碱地“逆天改命”:无用之地变良田,候鸟翔集水草丰美
  • 广西北流出现强降雨,1人被洪水冲走已无生命体征