以下是Selenium Grid在商城系统中自动化测试的实际应用方案,包含完整架构设计、实战代码示例和最佳实践:
一、Selenium Grid在商城的核心应用场景
1. 典型测试需求
场景 | 测试重点 | Grid优势 |
---|---|---|
多浏览器兼容性测试 | Chrome/Firefox/Safari渲染 | 并行跨浏览器执行 |
移动端兼容测试 | 不同分辨率/设备模拟 | 连接移动设备云(BrowserStack等) |
促销活动压力测试 | 高并发下单流程 | 分布式多节点同时模拟用户 |
全球化测试 | 多语言/地区UI验证 | 地理分布式节点本地化测试 |
2. 技术选型对比
二、Selenium Grid测试架构设计
1. 基础架构(Docker实现)
# docker-compose-grid.yml
version: '3'
services:
hub:
image: selenium/hub
ports:
- "4444:4444"
chrome:
image: selenium/node-chrome
depends_on:
- hub
environment:
- SE_EVENT_BUS_HOST=hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox
depends_on:
- hub
environment:
- SE_EVENT_BUS_HOST=hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
启动命令:
docker-compose -f docker-compose-grid.yml up -d --scale chrome=3 --scale firefox=2
2. 商城测试分层架构
# 测试目录结构
ecommerce_tests/
├── pages/ # Page Object模型
│ ├── product_page.py
│ └── cart_page.py
├── tests/
│ ├── test_search.py # 搜索功能测试
│ └── test_checkout.py # 下单流程测试
└── grid_config.py # Grid节点配置
三、核心测试场景实现
1. 多浏览器商品搜索测试
# test_search.py
import pytest
from selenium.webdriver.remote.webdriver import WebDriver
from pages.product_page import ProductPage
@pytest.mark.parametrize("browser", ["chrome", "firefox"])
def test_search_product(browser: str, grid_driver: WebDriver):
"""跨浏览器商品搜索测试"""
product_page = ProductPage(grid_driver)
product_page.load()
product_page.search("iPhone 14")
assert "iPhone 14" in product_page.get_first_result_text()
assert product_page.result_count() > 0
# conftest.py
@pytest.fixture
def grid_driver(request):
from selenium import webdriver
browser = request.param
driver = webdriver.Remote(
command_executor='http://localhost:4444/wd/hub',
options=get_browser_options(browser)
)
yield driver
driver.quit()
def get_browser_options(browser):
if browser == "chrome":
return webdriver.ChromeOptions()
elif browser == "firefox":
return webdriver.FirefoxOptions()
2. 分布式下单流程测试
# test_checkout.py
def test_checkout_flow(grid_driver):
"""完整下单流程测试"""
# 1. 添加商品到购物车
product_page = ProductPage(grid_driver)
product_page.add_to_cart("iPhone 14")
# 2. 进入结算页
cart_page = CartPage(grid_driver)
cart_page.proceed_to_checkout()
# 3. 填写收货信息
checkout_page = CheckoutPage(grid_driver)
checkout_page.fill_shipping_info({
'name': 'Test User',
'address': '123 Test St'
})
# 4. 选择支付方式
checkout_page.select_payment("credit_card")
# 5. 提交订单
order_page = checkout_page.submit_order()
assert order_page.is_success_message_displayed()
四、高级应用技巧
1. 动态节点分配策略
# grid_config.py
def get_optimal_node():
"""根据测试需求选择最优节点"""
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# 根据测试类型选择配置
if os.getenv('TEST_TYPE') == 'mobile':
caps = DesiredCapabilities.ANDROID
else:
caps = DesiredCapabilities.CHROME
caps['platform'] = 'WINDOWS' if os.name == 'nt' else 'LINUX'
# 连接云节点或本地Grid
executor = (
f"https://{
os.getenv('CLOUD_USER')}:{
os.getenv('CLOUD_KEY')}"
"@hub-cloud.browserstack.com/wd/hub"
if os.getenv('USE_CLOUD')
else "http://localhost:4444/wd/hub"
)
return webdriver.Remote(
command_executor=executor,
desired_capabilities=caps
)
2. 视频录制与日志收集
# conftest.py
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_protocol(item):
"""测试执行时录制视频"""
from selenium.webdriver.remote.webdriver import WebDriver
if isinstance(item.funcargs.get('grid_driver'), WebDriver):
driver = item.funcargs['grid_driver']
test_name = item.nodeid.replace("::", "_")
driver.start_recording_screen()
yield # 执行测试
if isinstance(item.funcargs.get('grid_driver'), WebDriver):
video_data = driver.stop_recording_screen()
with open(f"videos/{
test_name}.mp4", "wb") as f:
f.write(base64.b64decode(video_data))
五、CI/CD集成方案
1. Jenkins Pipeline示例
pipeline {
agent any
stages {
stage('Setup Grid') {
steps {
sh 'docker-compose -f grid.yml up -d --scale chrome=5'
}
}
stage('Run Tests') {
parallel {
stage('Chrome Tests') {
steps {
sh 'pytest tests/ --browser=chrome -n 5'
}
}
stage('Firefox Tests') {
steps {
sh 'pytest tests/ --browser=firefox -n 3'
}
}
}
}
stage('Generate Report') {
steps {
publishHTML target: [
allowMissing: true,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'reports',
reportFiles: 'index.html',
reportName: 'UI Test Report'
]
}
}
}
post {
always {
sh 'docker-compose -f grid.yml down'
}
}
}
2. 测试报告增强
# 生成可视化测试报告
@pytest.hookimpl(tryfirst=True)
def pytest_configure(config):
config.option.htmlpath = "reports/report_" + datetime.now().strftime("%Y%m%d_%H%M%S") + ".html"
六、性能优化策略
优化方向 | 具体措施 |
---|---|
节点管理 | 动态伸缩节点:docker-compose scale chrome=3 firefox=2 |
测试分发 | 按测试时长智能分配:长测试优先分配到空闲节点 |
网络优化 | 使用--shm-size=2g 避免Chrome内存溢出 |
失败重试 | pytest-rerunfailures 插件自动重试失败用例 |
七、常见问题解决方案
1. 元素定位失败处理
# pages/base_page.py
def safe_click(self, locator, timeout=10):
"""带自动重试的点击方法"""
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(self.driver, timeout).until(
EC.element_to_be_clickable(locator)
)
element.click()
2. 跨浏览器兼容性修复
# 处理浏览器差异
def input_text(self, text):
if self.driver.capabilities['browserName'].lower() == 'firefox':
self.driver.execute_script(f"arguments[0].value='{
text}';", self.element)
else:
self.element.send_keys(text)
八、监控与维护
1. Grid健康检查
# 检查节点状态
curl http://localhost:4444/status | jq '.value.nodes'
2. 资源监控看板
# 实时监控脚本
import requests
from prometheus_client import Gauge
grid_health = Gauge('grid_health', 'Selenium Grid nodes status')
def monitor_grid():
resp = requests.get("http://localhost:4444/status").json()
grid_health.set(len(resp['value']['nodes']))
通过以上方案,Selenium Grid在商城系统中可实现:
跨浏览器/跨平台:同时覆盖PC、Mobile、Tablet等多端测试
高效执行:并行运行缩短测试时间(实测可提升5-8倍速度)
真实场景模拟:不同地理位置节点测试CDN效果
无缝集成:与CI/CD工具链深度整合形成质量关卡
实际部署建议:
生产环境使用Kubernetes管理Grid节点
关键路径测试使用云平台补充设备覆盖(如iOS真机测试)
结合AI技术实现自动修复定位策略
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
暂无评论内容