You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用for循环让pytest.fixture为Selenium测试打开不同页面?

解决pytest+Selenium循环测试多页面只执行最后一个的问题

你的代码问题在于:循环中重复定义同名的driver fixture和test_number_one测试函数,每次循环都会覆盖之前的定义;同时Python闭包的延迟绑定特性,会让fixture里的page变量在执行时才取最终值(也就是列表最后一个元素"men"),所以最终只执行了最后一个页面的测试。

下面是两种规范的实现方式,都能让测试覆盖所有页面:

方法1:参数化测试函数

通过@pytest.mark.parametrize给测试函数传入页面参数,配合fixture接收参数实现多页面测试:

from selenium import webdriver
import pytest
import time

pages = ["what-is-new", "women", "men"]

@pytest.fixture()
def driver(request):
    # 获取测试用例传入的页面参数
    page = request.param
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(f"https://magento.softwaretestingboard.com/{page}.html")
    yield driver
    driver.quit()

# 参数化测试函数,indirect=True表示将参数传递给driver fixture
@pytest.mark.parametrize("driver", pages, indirect=True)
def test_number_one(driver):
    time.sleep(5)
    # 这里添加你的测试逻辑,比如验证页面标题
    assert driver.title.strip() != ""

方法2:参数化Fixture

直接在fixture中定义params参数,让pytest自动为每个页面生成独立测试用例:

from selenium import webdriver
import pytest
import time

@pytest.fixture(params=["what-is-new", "women", "men"])
def driver(request):
    page = request.param
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(f"https://magento.softwaretestingboard.com/{page}.html")
    yield driver
    driver.quit()

def test_number_one(driver):
    time.sleep(5)
    # 添加具体测试逻辑,比如检查页面是否包含目标元素
    assert "Welcome" in driver.page_source

两种方式的核心都是利用pytest的参数化机制,而非手动循环定义测试函数/fixture,这样每个页面都会生成独立的测试用例,且每个用例都能打开对应页面、执行测试后关闭浏览器。

内容的提问来源于stack exchange,提问作者Mateusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:55:21