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

StaleElementReferenceException и @FindBy

page-factory
page-object
webdriver
java
Теги: #<Tag:0x00007f7b645befa0> #<Tag:0x00007f7b645bedc0> #<Tag:0x00007f7b645bebe0> #<Tag:0x00007f7b645bea28>

(Taras) #1

У меня иногда возникают ошибки StaleElementReferenceException - механизм как их обойти понятний, вопрос как интегрировать его c @FindBy аннотациями, так как у меня елементи в Page Object-ах сирчаться через ету аннотацию. Может есть у кого то пример как переписать весь механизм FindBy, WebElement, Page Factory ? А то как я понимаю нужно в каком то месте findElement метод переписать…


(Serhii Tanchenko) #2

Прийдеться делать свой WebElement. Или просто перехать на selenide и не писать еще один велосипед :smile:


(James May) #3

попробуйте создать геттер для этого элемента и перед return поставьте ожидание. Дальше обращайтесь к этому элементу через геттер.


(Taras) #4

та свой WebElement я написал б, но как его с @FindBy прикрутить


(Serhii Tanchenko) #5

у нас свой WebElement + FindBy (для того что-бы jQuery селекторы юзать).


(breakmt) #6

Присоединяюсь к вопросу! Подскажите как сделать так, чтобы после findElement всегда происходило ожидание до тех пор пока не будет StaleElementReferenceException. Куда это дело прикрутить? :grinning:


(Taras) #7

вопрос решен.
Нужно переписать PageFactory, что я уже сделал в прошлом и подтюнить и подшаманить свой клас (ну лучше написать полностью с нуля) - DefaultElementLocator implements ElementLocator


#8

Сейчас AjaxElementLocator уже включили в стандартную support-библиотеку Selenium.

Просто используем перегрузку:

PageFactory.initElements(new AjaxElementLocatorFactory(driver, timeout)), page);

Но если надо больше возможностей - то да, своё нужно. Только не всегда нужно переписывать PageFactory, может хватить своей ElementLocatorFactory.


(Taras) #9

я PageFactory переписивал, потому что у меня каждий Page Object loadedCriteria метод имеет, которий через Function или Predicate ждет пока не прогрузиться что то на странице - ето типа критерий прогрузки той кондиции которая нужна для каждой страници для последсвующей роботи.


(asolntsev) #10

Используйте Selenide. Там эти вопросы уже решены. И свой элемент, и ожидание, и Аякс - ничего не придётся выдумывать.

http://ru.selenide.org/documentation/page-objects.html