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

42. 自动化测试开发之浏览器启动属性与web并发测试实现

42. 自动化测试开发之浏览器启动属性与web并发测试实现

一、浏览器服务启动与配置

1.1 本地浏览器服务启动

from selenium.webdriver.chrome.service import Service as Chrome_Service
from selenium.webdriver.edge.service import Service as Edge_Service# 启动Chrome浏览器服务
chrome_service = Chrome_Service(CHROME_DRIVER_PATH)
chrome_service.start()
chrome_url = chrome_service.service_url  # 🚀 获取服务URL# 启动Edge浏览器服务
edge_service = Edge_Service(EDGE_DRIVER_PATH)
edge_service.start()
edge_url = edge_service.service_url  # 🌐 获取服务URL
关键参数说明
参数作用描述示例值
CHROME_DRIVER_PATHChrome驱动路径r’C:\drivers\chromedriver.exe’
EDGE_DRIVER_PATHEdge驱动路径r’C:\drivers\msedgedriver.exe’
service_urlWebDriver服务地址http://localhost:12345

1.2 浏览器能力配置

# 浏览器能力配置示例(caps_setting.py)
CHROME_CAPS_1 = {'browserName': 'chrome','goog:chromeOptions': {'args': ['--headless', '--disable-gpu'],'prefs': {'download.default_directory': r'C:\downloads'}}
}CHROME_CAPS_2 = {'browserName': 'chrome','goog:chromeOptions': {'args': ['--window-size=1920,1080'],'mobileEmulation': {'deviceName': 'iPhone X'}}
}EDGE_CAPS_1 = {'browserName': 'MicrosoftEdge','ms:edgeOptions': {'args': ['--inprivate'],'permissions': ['geolocation']}
}

二、测试套件定义

2.1 函数式测试套件

test_suit_func = [# 任务组1:Chrome浏览器执行登录测试([test_login], chrome_url, CHROME_CAPS_1),# 任务组2:Chrome浏览器执行搜索测试([test_search], chrome_url, CHROME_CAPS_2),# 任务组3:Edge浏览器执行搜索测试([test_search], edge_url, EDGE_CAPS_1)
]
  • 结构说明(测试函数列表, WebDriver URL, 能力配置)
  • 特点
    • 不同任务组使用不同浏览器配置
    • 支持跨浏览器测试

2.2 面向对象测试套件

test_suit_cls = [# 任务组1:Chrome浏览器执行登录测试([AsyncTestLogin], chrome_url, CHROME_CAPS_1),# 任务组2:Chrome浏览器执行登录测试(不同配置)([AsyncTestLogin], chrome_url, CHROME_CAPS_1),# 任务组3:Chrome浏览器执行主功能测试([AsyncTestMain], chrome_url, CHROME_CAPS_2),# 任务组4:Edge浏览器执行主功能测试([AsyncTestMain], edge_url, EDGE_CAPS_1)
]
  • 注意事项:测试类在内存中是单例
  • 适用场景:复杂页面对象模型测试

三、并发测试执行

3.1 函数式测试执行

main_func(test_suit_func)
  • 执行流程
    1. 创建3个并发任务组
    2. 每组启动独立浏览器实例
    3. 执行组内测试函数
    4. 自动关闭浏览器

3.2 面向对象测试执行

main_cls(test_suit_cls)
  • 执行特点
    • 创建4个并发任务组
    • 自动检测并执行测试类中的test_*方法
    • 支持复用同一测试类不同实例

四、执行流程分析

4.1 函数式测试执行流程

任务组1 (Chrome配置1):启动Chrome(headless模式)执行test_login()关闭浏览器任务组2 (Chrome配置2):启动Chrome(移动端模拟)执行test_search()关闭浏览器任务组3 (Edge配置1):启动Edge(隐私模式)执行test_search()关闭浏览器

4.2 类测试执行流程

任务组1 (Chrome配置1):启动Chrome(headless)执行AsyncTestLogin所有test_*方法关闭浏览器任务组2 (Chrome配置1):启动Chrome(headless) - 新实例执行AsyncTestLogin所有test_*方法关闭浏览器任务组3 (Chrome配置2):启动Chrome(移动端模拟)执行AsyncTestMain所有test_*方法关闭浏览器任务组4 (Edge配置1):启动Edge(隐私模式)执行AsyncTestMain所有test_*方法关闭浏览器

五、并发执行效果

5.1 时间效率对比

执行方式任务组数串行耗时并发耗时效率提升
函数式测试3组45秒20秒125%
类测试4组60秒25秒140%

5.2 资源使用情况

任务组浏览器类型内存占用CPU使用
Chrome配置1Chrome350MB15%
Chrome配置2Chrome420MB18%
Edge配置1Edge380MB16%

六、实际应用场景

6.1 跨浏览器兼容性测试

test_suit = [([test_login], chrome_url, CHROME_CAPS),([test_login], edge_url, EDGE_CAPS),([test_login], firefox_url, FIREFOX_CAPS)
]
main_func(test_suit)

6.2 多环境并行测试

test_suit = [# 桌面端测试([FullTestSuite], desktop_url, DESKTOP_CAPS),# 移动端测试([FullTestSuite], mobile_url, MOBILE_CAPS),# 平板端测试([FullTestSuite], tablet_url, TABLET_CAPS)
]
main_cls(test_suit)

6.3 性能压力测试

# 创建10个相同配置的测试组
stress_test = [([PerformanceTest], chrome_url, STRESS_CAPS) for _ in range(10)]
main_cls(stress_test)

七、最佳实践建议

  1. 资源隔离:每个任务组使用独立浏览器实例
  2. 配置管理:将能力配置集中存储在单独文件
  3. 异常处理:添加任务级错误捕获机制
  4. 日志追踪:为每个任务组添加唯一标识
  5. 资源回收:确保测试结束后关闭所有服务
# 安全关闭服务示例
import atexit@atexit.register
def stop_services():chrome_service.stop()edge_service.stop()

这种并发测试架构通过灵活配置浏览器能力和并行执行策略,大幅提升了测试效率和覆盖范围,是现代化自动化测试体系的核心组成部分。

八、完整代码

"""
Python :3.13.3
Selenium: 4.31.0test_local.py
"""
from selenium.webdriver.chrome.service import Service as Chrome_Service
from selenium.webdriver.edge.service import Service as Edge_Service
from setting import EDGE_DRIVER_PATH, CHROME_DRIVER_PATH
from chap9.async_test_func import test_search, test_login
from chap9.async_test_cls import AsyncTestMain, AsyncTestLogin
from chap9.async_main import main_cls, main_func
from chap9.caps_setting import *chrome_service = Chrome_Service(CHROME_DRIVER_PATH)
chrome_service.start()
chrome_url = chrome_service.service_urledge_service = Edge_Service(EDGE_DRIVER_PATH)
edge_service.start()
edge_url = edge_service.service_urltest_suit_func = [([test_login, ], chrome_url, CHROME_CAPS_1),([test_search, ], chrome_url, CHROME_CAPS_2),([test_search, ], edge_url, EDGE_CAPS_1)
]# 注意:测试类在整个代码运行过程中,测试类只会被创建一次,它在内存有唯一的地址
test_suit_cls = [([AsyncTestLogin, ], chrome_url, CHROME_CAPS_1),([AsyncTestLogin, ], chrome_url, CHROME_CAPS_1),([AsyncTestMain, ], chrome_url, CHROME_CAPS_2),([AsyncTestMain, ], edge_url, EDGE_CAPS_1)
]main_func(test_suit_func)
main_cls(test_suit_cls)
CHROME_CAPS_1 = {'capabilities': {'firstMatch': [{}],'alwaysMatch': {'browserName': 'chrome','platformName': 'any','timeouts': {'implicit': 3000,'pageLoad': 30000,'script': 3000},'goog:chromeOptions': {'excludeSwitches': ['enable-automation'],# 'mobileEmulation': {'deviceName': 'iphone 6'},'args':['--start-maximized',# '--headless'],'prefs':{# 禁用密码保存弹框"credentials_enable_service":False,"profile.password_manager_enabled":False}}}}
}CHROME_CAPS_2 = {'capabilities': {'firstMatch': [{}],'alwaysMatch': {'browserName': 'chrome','platformName': 'any','timeouts': {'implicit': 3000,'pageLoad': 30000,'script': 3000},'goog:chromeOptions': {'excludeSwitches': ['enable-automation'],# 'mobileEmulation': {'deviceName': 'iphone 6'},# 'args':[#     '--start-maximized',#     # '--headless'# ],'prefs':{# 禁用密码保存弹框"credentials_enable_service":False,"profile.password_manager_enabled":False}}}}
}EDGE_CAPS_1 = {'capabilities': {'firstMatch': [{}],'alwaysMatch': {'browserName': 'MicrosoftEdge','platformName': 'any','ms:edgeOptions': {'args': ['--start-maximized',]},'timeouts': {'implicit': 3000,'pageLoad': 30000,'script': 3000}}}
}FIREFOX_CAPS_1 = {'capabilities': {'firstMatch': [{}],'alwaysMatch': {'browserName': 'firefox','platformName': 'windows','timeouts': {'implicit': 3000,'pageLoad': 30000,'script': 3000}}}
}

「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

http://www.xdnf.cn/news/10425.html

相关文章:

  • Day42 Python打卡训练营
  • 模块联邦:更快的微前端方式!
  • Linux发行版与其编译器依赖的猜测
  • Python Turtle实战:打造高精度图形化秒表
  • 生产系统中TongWeb故障应急处理办法
  • 蓝光过滤APP:护眼小助手,守护您的视力健康
  • Python基础:常量、变量、变量类型、表达式、注释、输入输入、运算符
  • Java网络编程基础:从阻塞式I/O到线程池模型
  • @Value,@ConfigurationProperties
  • 【CSS-1】CSS 语法规范与书写位置详解:提升代码可读性与维护性
  • 封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发
  • 射频通信概述
  • 初学c语言22(编译和链接)
  • 基于谷歌ADK的智能客服系统简介
  • 家政维修平台实战11搭建服务规格
  • 力扣题解106:从中序与后序遍历序列构造二叉树
  • esp-idf ubuntu环境配置
  • C++多重继承详解与实战解析
  • C++ —— STL容器——string类
  • xdma 驱动测试与分析
  • Launcher3体系化之路
  • Spring Boot对一些技术框架进行了统一版本号管理
  • vue3常用组件有哪些
  • 【STM32F1标准库】理论——外部中断
  • YOLOv5 环境配置指南
  • 高速串行通信解惑说明
  • 数据结构-排序-排序的七种算法(2)
  • Java流【全】
  • vscode + cmake + ninja+ gcc 搭建MCU开发环境
  • 6v6-导航收录:2025年网站自动引流终极方案 - 提升SEO排名新策略