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
解决方案
核心问题分析
- 手动调用测试方法绕过pytest机制:直接实例化测试类并调用
test_search_results()会跳过pytest的fixture注入流程,导致self.driver无法被赋值。 - 错误的driver访问方式:修改后直接使用
driver而非self.driver,但driver是pytest注入到测试类的属性,必须通过self访问。 - API使用错误:
webdriver.wait是无效调用,正确的等待API是WebDriverWait。 - 缺少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
相关产品推荐
相关产品推荐

