如何将WebDriver传递到导入测试?代码报错原因排查
问题原因与解决方案
错误根源
你遇到的AttributeError是因为测试实例不共享:
你在main_tests.py的test_00_02_imported_tests里手动创建了ImportTestSet实例并调用set_driver传递了driver,但unittest.TestLoader().loadTestsFromModule(import_test_set)会重新创建ImportTestSet的全新实例来执行测试——这个新实例从未调用过set_driver,自然没有driver属性。
解决方案
方案一:通过类属性传递Driver(推荐)
修改import_test_set.py,将driver定义为类级属性,让所有测试实例共享:
import unittest from selenium.webdriver.common.by import By class ImportTestSet(unittest.TestCase): driver = None # 定义类级别的driver变量 @classmethod def setUpClass(cls): cls.i_wait = 5 def test_00_02_01_enter(self): print('test_00_02_01_enter') self.driver.implicitly_wait(self.i_wait) # 注意:谷歌首页实际是"Sign in"(英文)或"登录"(中文),"Log in"会找不到元素,需对应修改 a_enter = self.driver.find_element(By.LINK_TEXT, 'Sign in') a_enter.click() page_title = self.driver.title self.assertEqual(page_title, 'Google') def runTest(self): pass
然后修改main_tests.py的test_00_02_imported_tests,直接给类绑定driver:
def test_00_02_imported_tests(self): print('test_00_02_imported_tests') # 直接给ImportTestSet类设置driver import_test_set.ImportTestSet.driver = self.driver suite = unittest.TestLoader().loadTestsFromModule(import_test_set) result = unittest.TextTestRunner(verbosity=2).run(suite) self.assertEqual(result.failures, [])
方案二:手动创建测试实例并注入Driver
如果不想修改导入的测试类,可在main_tests.py里手动创建测试用例实例,确保使用同一个注入了driver的实例:
def test_00_02_imported_tests(self): print('test_00_02_imported_tests') # 手动创建测试用例实例,注入driver后加入测试套件 test_case = import_test_set.ImportTestSet('test_00_02_01_enter') test_case.set_driver(self.driver) suite = unittest.TestSuite([test_case]) result = unittest.TextTestRunner(verbosity=2).run(suite) self.assertEqual(result.failures, [])
额外提示
谷歌首页的登录链接文本不是Log in,英文环境是Sign in,中文环境是登录,你需要根据实际页面修改By.LINK_TEXT的参数,否则会触发NoSuchElementException。
内容的提问来源于stack exchange,提问作者Simply One
相关产品推荐
相关产品推荐

