【问题标题】: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 的响应。在示例代码中使用了setUpClasstearDownClass 方法。调用这些方法来准备测试类,并且在执行测试类中的所有测试之前只调用一次。

      这适用于您的情况,因为在每次测试开始时,您都会覆盖 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 是您的测试类的名称。

      另一种选择是在每个测试用例之前使用setUptearDown 方法来初始化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")
      

      setUptearDown 方法都接受 TestClass 的实例作为 self 参数,并且您的测试无需任何额外更改即可工作。

      注意:通常第二个选项更适合单元测试,因为在使用find_element_by_name 之前,您无需确保在每个测试中都覆盖driver 内部状态。在第二个选项中,您可以将self.driver.get("https://google.com") 代码放入 setUp 方法中,因为无论如何它都会在每个测试用例之前执行。

      【讨论】:

        猜你喜欢
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多