如何用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
相关产品推荐
相关产品推荐

