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.0

test_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_url

edge_service = Edge_Service(EDGE_DRIVER_PATH)
edge_service.start()
edge_url = edge_service.service_url

test_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
            }
        }
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值