Сценарий Selenium Python, InvalidElementStateException - PullRequest
0 голосов
/ 17 октября 2018

Так что я получаю эту ошибку время от времени при выполнении одного и того же теста.

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=69.0.3497.100)
(Driver info: chromedriver=2.41.578706 (5f725d1b4f0a4acbf5259df887244095596231db),platform=Mac OS X 10.12.6 x86_64)

Единственная проблема заключается в том, что это кажется несовместимым с различными областями кода.Это когда я пытаюсь получить доступ к DOM-элементам, таким как поле поиска, на моей странице ReactJS.Я запускаю это через ROBOT Automation Framework, используя смесь SeleniumLibrary и пользовательской библиотеки.

Я читал, что это просто, как кажется, xPath устарел в DOM, но это не такне поможет мне понять, почему это противоречивая ошибка, возникающая практически в любом месте в любой точке.

РЕДАКТИРОВАТЬ: Кажется, что происходит в этом:

def filter_modality(self, filter):
    filter_value = '//span[@title="{}"]//parent::li'.format(filter)

    self.selib.click_element(filter_locator)
    self.selib.wait_until_page_contains_element('//*[@class="multi-selector-options open"]')

    self.selib.wait_until_element_is_visible(filter_value)
    self.selib.click_element(filter_value )
    self.selib.wait_until_page_contains_element('//div...[@class="option selector-item active"]',
                                                error=("Could not select filter: {}".format(filter_value )))

    #I get the stale element message from or after executing this click_element
    self.selib.click_element(filter_locator)
    self.selib.wait_until_page_does_not_contain_element('//*[@class="multi-selector-options open"]', 
                                                        error="Filter dropdown did not disappear after selection")

1 Ответ

0 голосов
/ 20 октября 2018

Исключение возникает, когда SE обнаружил элемент, но вскоре после этого что-то (функция JS) изменило его - удалило / переставило его в DOM или значительно изменило его атрибуты, поэтому оно больше не отслеживается как тот же элемент.
Это связано с тем, что SE создает внутренний кэш DOM, который может стать десинхронизированным из фактического;При этом название «несвежее» - эл.кешируется в каком-то состоянии, но его фактическая форма теперь другая.

Проблема в том, что для нее есть специальный SO-тег - https://stackoverflow.com/questions/tagged/staleelementreferenceexception (я сам был удивлен этим).

Распространенными решениями являются:

  • на несколько секунд перед тем, как событие, о котором вы знаете, вызовет проблему
  • повторно получит элемент перед его использованием (есливы сохраняете ссылку на него в WebElement объекте, что на самом деле не так с роботизированной рамкой)
  • имеет механизм повторной проверки при работе с элементом, который, как вы знаете, может вызвать выполнение
  • проглотитьисключение и продвижение (я сделал это в нескольких местах, где элемент был просто подтверждением того, что была выполнена операция - она ​​была показана / найдена SE один раз, после этого мне все равно, изменилась ли она в DOM)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...