【问题标题】:Problem with unittest -- receiving str object has no attribute 'get'unittest 的问题——接收 str 对象没有属性“get”
【发布时间】:2019-04-13 13:21:57
【问题描述】:
我正在使用带有unittest 的示例代码,但在执行它时收到一个错误——“str”对象没有“get”属性。
我搜索了谷歌,但没有得到答案。
from selenium import webdriver
import unittest
class google1search(unittest.TestCase):
driver = 'driver'
@classmethod
def setupClass(cls):
cls.driver = webdriver.Chrome(chrome_options=options)
cls.driver.implicitly_wait(10)
cls.driver.maximize_window()
def test_search_automationstepbystep(self):
self.driver.get("https://google.com")
self.driver.find_element_by_name("q").send_keys("Automation Step By step")
self.driver.find_element_by_name("btnk").click()
def test_search_naresh(self):
self.driver.get("https://google.com")
self.driver.find_element_by_name("q").send_keys("Naresh")
self.driver.find_element_by_name("btnk").click()
@classmethod
def teardownClass(cls):
cls.driver.close()
cls.driver.quit()
print("Test completed")
if __name__== "__main__":
unittest.main()
假设执行2个步骤并给出结果。
【问题讨论】:
标签:
python
selenium
python-unittest
【解决方案1】:
在上面的代码中:
没有初始化self.driver
self.driver.get("https://google.com")
因为驱动程序启动是为了
cls.driver = webdriver.Chrome(chrome_options=options)
请将 cls 替换为 self
【解决方案2】:
我想稍微扩展@sarthak 的响应。在示例代码中使用了setUpClass 和tearDownClass 方法。调用这些方法来准备测试类,并且在执行测试类中的所有测试之前只调用一次。
这适用于您的情况,因为在每次测试开始时,您都会覆盖 driver 对象的内部状态,并且您之前的测试执行不应影响您的下一个测试结果。在这种情况下,您需要修改测试以使用类对象:
def test_search_automationstepbystep(self):
TestClass.driver.get("https://google.com")
TestClass.driver.find_element_by_name("q").send_keys("Automation Step By step")
TestClass.driver.find_element_by_name("btnk").click()
def test_search_naresh(self):
TestClass.driver.get("https://google.com")
TestClass.driver.find_element_by_name("q").send_keys("Naresh")
TestClass.driver.find_element_by_name("btnk").click()
TestClass 是您的测试类的名称。
另一种选择是在每个测试用例之前使用setUp 和tearDown 方法来初始化driver 对象:
def setUp(self):
self.driver = webdriver.Chrome(chrome_options=options)
self.driver.implicitly_wait(10)
self.driver.maximize_window()
def tearDown(self):
self.driver.close()
self.driver.quit()
print("Test completed")
setUp 和 tearDown 方法都接受 TestClass 的实例作为 self 参数,并且您的测试无需任何额外更改即可工作。
注意:通常第二个选项更适合单元测试,因为在使用find_element_by_name 之前,您无需确保在每个测试中都覆盖driver 内部状态。在第二个选项中,您可以将self.driver.get("https://google.com") 代码放入 setUp 方法中,因为无论如何它都会在每个测试用例之前执行。