Selenium Grid在商城系统中自动化测试的实际应用方案

以下是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
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容