Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

[Resolved] Exception StaleElementReferenceException and NoSuchElementException


(Максим Малунов) #1

Exception StaleElementReferenceException and NoSuchElementException
Собственно в чем разница и зачем нужны оба ?

http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp это я читал .
и докучи что за Should you wish to head down this route, the simplest hook point is to call setElementConverter.

setElementConverter - этим кто-то пользовался ?


(Sergey Korol) #2

Представим, что у вас есть инпут, который отсылает какую-то информацию на сервер по смене фокуса, при этом, обновляя часть имеющейся формы (включая сам инпут).

Как в старые добрые времена, вы наверняка захотите вначале его очистить перед непосредственным заполнением. Т.е. технически цепочка выглядит следующим образом: findElement -> clear -> sendKeys.

Все бы ничего, но ввиду баговости метода clear, который зовет событие onChange, ваш инпут после очистки попытается обновить часть формы, не дожидаясь ввода текста. Т.е. в данном конкретном примере ваша цепочка прервется на sendKeys со StaleElementReferenceException, т.к. вы попытаетесь обратиться к элементу, который в данный момент обновляется, т.е. его состояние не позволяет вам с ним взаимодействовать прямо сию минуту, надо подождать, пока он вновь вернется в DOM.

Если бы элемента не было вообще на форме до попытки любого взаимодействия с ним, то вы бы получили NoSuchElementException при обращении к findElement.

Как пишет один из selenium коммитеров:

Please ignore the suggestion / recommendation for setElementConverter… that’s a bit old of documentation, it does exist still, just not really recommended. Typically you can attempt to retry the find as an alternative to this.

Что по сути схоже с механизмом явных ожиданий.