Pytest无法识别fixture及直接调用fixture报错问题求助
问题分析
- fixture识别错误:当注释
@pytest.fixture()时,测试函数test_supplier的参数create_list会被pytest默认识别为fixture,但它实际是普通函数,因此触发"fixture not found"错误。 - fixture调用违规:当启用
@pytest.fixture()装饰器后,直接调用create_list()不符合pytest的fixture机制——fixture是由pytest自动注入到测试函数中的,不能手动调用。 - 测试执行方式错误:手动通过
for循环调用测试函数,不符合pytest的测试发现与执行逻辑,无法被pytest正确识别和执行。 - 额外代码问题:使用全局
driver会导致测试用例间的资源污染;driver.close()后调用driver.quit()可能引发异常;time.sleep的等待方式不够可靠。
修正方案
使用pytest的参数化测试(@pytest.mark.parametrize)来实现多字符串的重复测试,这是pytest官方推荐的多数据用例执行方式,同时修复资源管理问题:
import pytest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import login_credientials @pytest.mark.parametrize("supplier_name", ["Walker", "Rio"]) def test_supplier(supplier_name): # 初始化driver,使用局部变量避免全局污染 chrome_linux_64 = './Drivers/chromedriver_linux64' driver = webdriver.Chrome(chrome_linux_64) try: driver.get("https://iprocure.com") # 使用显式等待替代time.sleep,更可靠 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "login")) ) username = driver.find_element(By.ID, "login") username.send_keys(login_credientials.LOGIN_USER) password = driver.find_element(By.ID, "Passwd") password.send_keys(login_credientials.LOGIN_PASSWORD) driver.find_element(By.ID, "btnLogin").click() # 等待链接加载完成后点击 WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.LINK_TEXT, supplier_name)) ).click() finally: # 无论测试成功失败,都确保driver退出 driver.quit()
修正说明
- 参数化实现:通过
@pytest.mark.parametrize装饰器,将["Walker", "Rio"]作为测试数据传入,pytest会自动为每个数据生成独立的测试用例,分别执行test_supplier。 - 资源管理:使用局部
driver替代全局变量,避免测试用例间的资源冲突;通过try...finally确保driver.quit()始终执行,防止浏览器进程残留。 - 等待优化:用
WebDriverWait显式等待替代time.sleep,等待元素出现或可点击后再操作,提升测试稳定性。
内容的提问来源于stack exchange,提问作者varun
相关产品推荐
相关产品推荐

