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

Pytest无法识别fixture及直接调用fixture报错问题求助

问题分析
  1. fixture识别错误:当注释@pytest.fixture()时,测试函数test_supplier的参数create_list会被pytest默认识别为fixture,但它实际是普通函数,因此触发"fixture not found"错误。
  2. fixture调用违规:当启用@pytest.fixture()装饰器后,直接调用create_list()不符合pytest的fixture机制——fixture是由pytest自动注入到测试函数中的,不能手动调用。
  3. 测试执行方式错误:手动通过for循环调用测试函数,不符合pytest的测试发现与执行逻辑,无法被pytest正确识别和执行。
  4. 额外代码问题:使用全局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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:45:46