Проблема с unittest - получающий объект str не имеет атрибута 'get' - PullRequest
2 голосов
/ 13 апреля 2019

Я использую пример кода с 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 ]

1 голос
/ 13 апреля 2019

Я хочу немного расширить ответ @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, и ваши тесты должны работатьбез каких-либо дополнительных изменений.

Примечание. Обычно для модульного тестирования предпочтительнее второй вариант, так как вам не нужно проверять в каждом тесте, что вы перезаписываете driver внутреннее состояние перед использованием find_element_by_name,А во втором варианте вы можете поместить self.driver.get("https://google.com") код в метод setUp, потому что он все равно будет выполняться перед каждым тестовым примером.

1 голос
/ 13 апреля 2019

В приведенном выше коде: инициализация self.driver для

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

не выполняется, поскольку инициированный драйвер предназначен для

cls.driver = webdriver.Chrome(chrome_options=options)

, замените cls с self

...