У меня иногда возникают ошибки StaleElementReferenceException - механизм как их обойти понятний, вопрос как интегрировать его c @FindBy аннотациями, так как у меня елементи в Page Object-ах сирчаться через ету аннотацию. Может есть у кого то пример как переписать весь механизм FindBy, WebElement, Page Factory ? А то как я понимаю нужно в каком то месте findElement метод переписать…
Прийдеться делать свой WebElement. Или просто перехать на selenide и не писать еще один велосипед
попробуйте создать геттер для этого элемента и перед return поставьте ожидание. Дальше обращайтесь к этому элементу через геттер.
та свой WebElement я написал б, но как его с @FindBy прикрутить
у нас свой WebElement + FindBy (для того что-бы jQuery селекторы юзать).
Присоединяюсь к вопросу! Подскажите как сделать так, чтобы после findElement всегда происходило ожидание до тех пор пока не будет StaleElementReferenceException. Куда это дело прикрутить?
вопрос решен.
Нужно переписать PageFactory, что я уже сделал в прошлом и подтюнить и подшаманить свой клас (ну лучше написать полностью с нуля) - DefaultElementLocator implements ElementLocator
Сейчас AjaxElementLocator уже включили в стандартную support-библиотеку Selenium.
Просто используем перегрузку:
PageFactory.initElements(new AjaxElementLocatorFactory(driver, timeout)), page);
Но если надо больше возможностей - то да, своё нужно. Только не всегда нужно переписывать PageFactory, может хватить своей ElementLocatorFactory.
я PageFactory переписивал, потому что у меня каждий Page Object loadedCriteria метод имеет, которий через Function или Predicate ждет пока не прогрузиться что то на странице - ето типа критерий прогрузки той кондиции которая нужна для каждой страници для последсвующей роботи.
Используйте Selenide. Там эти вопросы уже решены. И свой элемент, и ожидание, и Аякс - ничего не придётся выдумывать.