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

AttributeError:对象无'driver'属性,Pytest+Selenium测试框架排查

Google搜索结果统计测试框架问题排查

我正在搭建一个测试框架,用于统计google.com上关键词的搜索结果数量,框架结构如下:

repo
 |-pages
 |   |-google_launch_page.py
 |   |-google_search_results.py
 |
 |-tests
 |   |-conftest.py
 |   |-test_google.py
 |-conftest.py

初始代码与报错

test_google.py 代码

from selenium.webdriver.common.by import By
from pages.google_launch_page import LaunchPage
from pages.google_search_results_page import SearchResultPage
import time, re, pytest

@pytest.mark.usefixtures("setup")
class testgooglesite():
    def test_search_results(self):
        lp = LaunchPage(self.driver)
        lp.clickSearch("Chocolate")
        # test 1: there should be non-zero results
        result_element = self.driver.find_element(By.XPATH, "//div[@id='result-stats']")
        result_text = result_element.text
        numbers = re.findall(r'\d{1,3}(?:\s?\d{3})*', result_text)[0]
        result_count = int(''.join(numbers[0]))
        self.driver.close()
        assert result_count>0,"No results"

myobj = testgooglesite()
myobj.test_search_results()

tests/conftest.py 代码(根目录repo/conftest.py为空)

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import pytest

@pytest.fixture(scope="class")
def setup(request):
    service = Service()
    options = webdriver.ChromeOptions()

    driver = webdriver.Chrome(service=service, options=options)
    driver.get('https://google.com/')
    webdriver.wait(driver,5)
    driver.maximize_window()
    request.cls.driver = driver

运行报错

tests\test_google.py:16: in test_search_results
    lp = LaunchPage(self.driver)
E   AttributeError: 'testgooglesite' object has no attribute 'driver'

我推测pytest可能未识别conftest.py,但无法确定原因。


修改后的代码与新报错

修改后的tests/conftest.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import pytest

@pytest.fixture(scope="class", autouse=True)
def driver(request):
    service = Service()
    options = webdriver.ChromeOptions()

    driver = webdriver.Chrome(service=service, options=options)
    driver.get('https://google.com/')
    webdriver.wait(driver,5)
    driver.maximize_window() 
    request.cls.driver = driver
    yield driver

修改后的test_google.py

from selenium.webdriver.common.by import By
from pages.google_launch_page import LaunchPage
from pages.google_search_results_page import SearchResultPage
import time, re, pytest

# @pytest.mark.usefixtures("driver")
class testgooglesite():
    def test_search_results(self):
        lp = LaunchPage(driver)
        lp.clickSearch("Chocolate")
        # test 1: there should be non-zero results
        # find the corresponding element
        result_element = driver.find_element(By.XPATH, "//div[@id='result-stats']")
        result_text = result_element.text
        print(result_text)
        numbers = re.findall(r'\d{1,3}(?:\s?\d{3})*', result_text)[0]
        result_count = int(''.join(numbers[0]))
        driver.close()
        assert result_count>0,"No results"

myobj = testgooglesite()
myobj.test_search_results()

新报错

E   NameError: name 'driver' is not defined

解决方案

核心问题分析

  1. 手动调用测试方法绕过pytest机制:直接实例化测试类并调用test_search_results()会跳过pytest的fixture注入流程,导致self.driver无法被赋值。
  2. 错误的driver访问方式:修改后直接使用driver而非self.driver,但driver是pytest注入到测试类的属性,必须通过self访问。
  3. API使用错误:webdriver.wait是无效调用,正确的等待API是WebDriverWait。
  4. 缺少teardown逻辑:初始fixture没有释放浏览器资源的步骤。

具体修复步骤

1. 修正test_google.py

移除手动实例化代码,恢复fixture装饰器,使用self.driver访问浏览器实例,同时修复结果统计的正则处理错误:

from selenium.webdriver.common.by import By
from pages.google_launch_page import LaunchPage
from pages.google_search_results_page import SearchResultPage
import re, pytest

@pytest.mark.usefixtures("driver")
class TestGoogleSite:
    def test_search_results(self):
        lp = LaunchPage(self.driver)
        lp.clickSearch("Chocolate")
        
        # 验证搜索结果数量非零
        result_element = self.driver.find_element(By.XPATH, "//div[@id='result-stats']")
        result_text = result_element.text
        # 提取数字并去除空格转整数
        numbers = re.findall(r'\d{1,3}(?:\s?\d{3})*', result_text)[0]
        result_count = int(numbers.replace(" ", ""))
        
        assert result_count > 0, "No search results found"

2. 修正tests/conftest.py

修复等待API,添加teardown逻辑关闭浏览器:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
import pytest

@pytest.fixture(scope="class", autouse=True)
def driver(request):
    service = Service()
    options = webdriver.ChromeOptions()
    # 可选:添加无头模式,避免弹窗
    # options.add_argument("--headless=new")

    driver = webdriver.Chrome(service=service, options=options)
    driver.get('https://google.com/')
    # 可选:等待搜索框加载完成,确保页面就绪
    # WebDriverWait(driver, 10).until(lambda d: d.find_element(By.NAME, "q").is_displayed())
    driver.maximize_window() 
    request.cls.driver = driver
    
    yield driver
    
    # 测试结束后关闭浏览器
    driver.quit()

3. 删除根目录空的conftest.py

根目录的空文件无实际作用,直接删除即可。

4. 正确运行测试

使用pytest命令启动测试,不要手动调用测试方法:

pytest tests/test_google.py -v

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:34:49