单元测试的问题-接收str对象没有属性'get'

时间:2019-04-13 13:21:57

标签: python selenium python-unittest

我正在将示例代码与unittest一起使用,但是执行该示例时会收到错误消息-'str'对象没有属性'get'。

我搜索了Google,但没有得到答案。

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个步骤并给出结果传递。

2 个答案:

答案 0 :(得分:1)

在上面的代码中:

没有对self.driver进行初始化
class Mother(object):
    def __init__(self):
        self.haircolor = "Brown"

class Child(Mother):
    def __init__(self): 
        super(Child, self).__init__()

    def print_haircolor(self):
        print self.haircolor

c = Child()
c.print_haircolor() # output: brown

启动的驱动程序用于

self.driver.get("https://google.com")

请将 cls 替换为 self

答案 1 :(得分:1)

我想扩展@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的参数,并且您的测试应该可以正常工作,而无需进行任何其他更改。

  

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