StaleElementReferenceException и @FindBy

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

1 лайк

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

3 лайка

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

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

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

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

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

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

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

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

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

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

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

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