Как обойти исключение устаревших элементов в PyTest - PullRequest
2 голосов
/ 02 мая 2020

В приведенном ниже тесте я нажимаю на каждую карточку на по этой ссылке и проверяю, совпадает ли текст заголовка. Я сталкиваюсь с StaleElementReferenceException, и я предполагаю, что переменная internships становится устаревшей после нажатия на карту, даже если я использую self.driver.back(), чтобы вернуться на страницу, с которой я нажал.

Есть ли обходной путь для этот тип вопроса? Или мне нужно создавать отдельные тесты для каждой карты? Если да, есть ли в PyTest встроенный модуль, который позволяет легко создавать отдельные тесты?

def test_internship_links(self):
    num_title_mismatch = 0
    title_mismatches = {}
    internships_xpath = (
        "//div[@id='related_projects']//div[@class='project-description']/h3"
    )
    internships = self.driver.find_elements(By.XPATH, internships_xpath)
    for internship in internships:
        outer_title = internship.text
        internship.click()
        inner_title = self.driver.find_element(
            By.XPATH, "//div[@class='primary']//h1"
        ).text
        if inner_title != outer_title:
            num_title_mismatch += 1
            title_mismatches[outer_title] = inner_title
        self.driver.back()
    assert (
        num_title_mismatch == 0
    ), f"\n{num_title_mismatch} title mismatch(es) found:\n{title_mismatches}"

Отслеживание ошибок:

________________________________________________________________________ TestSearchInterships.test_internship_links ________________________________________________________________________

self = <test_search_internships.TestSearchInterships object at 0x1081bfe90>

    def test_internship_links(self):
        num_title_mismatch = 0
        title_mismatches = {}
        internships_xpath = (
            "//div[@id='related_projects']//div[@class='project-description']/h3"
        )
        internships = self.driver.find_elements(By.XPATH, internships_xpath)
        for internship in internships:
>           outer_title = internship.text

tests/test_search_internships.py:41: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../../.local/share/virtualenvs/converge-testing-PXQ7_xev/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py:81: in text
    return self._execute(Command.GET_ELEMENT_TEXT)['value']
../../../.local/share/virtualenvs/converge-testing-PXQ7_xev/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py:693: in _execute
    return self._parent.execute(command, params)
../../../.local/share/virtualenvs/converge-testing-PXQ7_xev/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py:338: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

1 Ответ

0 голосов
/ 02 мая 2020

Эта проблема может возникать, если операция DOM (объектная модель документа) на странице временно вызывает недоступность элемента.

Я вижу 2 возможных пути решения вашей проблемы.

1) Вместо использования self.driver.back() для возврата на страницу вы можете снова перейти к ссылке. Например: driver.get('your_url')

2) Вы можете попытаться получить доступ к элементу несколько раз в al oop, прежде чем, наконец, вызвать исключение. Вы можете проверить решение Даррела Грейнджера здесь .

Пожалуйста, подскажите мне, если я как-то помог =)

...