Решаю вопрос с ненавистной ошибкой StaleElementReferenceException
Как понял, прочитав разные статьи про этот вопрос, самый нормальный вариант - это обрабатывать возможность данной ошибки и пытаться обратиться к элементу еще раз пока ошибки не будет
(либо будет превышено разумное число попыток).
Мне хотелось бы избежать написания какого-то отдельного метода, например, безопасного клика, потому что заранее неизвестно на каком элементе может быть такой затор. И я подумал сделать
небольшую “обёртку” для класса AbstractWebDriverEventListener.
В нем есть метод
afterFindBy(By by, WebElement element, WebDriver driver)
,
который дает выполнять действия после того как элемент был найден. Как я думаю это то самое место, где нужно вставить эту обработку StaleElementReferenceException.
Попробовал сделать вот так:
wait.until(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver webDriver) {
try {
element.isDisplayed();
} catch (StaleElementReferenceException exception) {
Log.write("Обработка StaleElementReferenceException!");
return false;
}
return true;
}
});
Проблема в том, что element в данном случае null. Как я порыл - это из-за того что он ищется через webDriver, а не через webElement (https://code.google.com/p/selenium/issues/detail?id=4907)
Используется шаблон Page Object и элементы описываются по FindBy:
@FindBy(id = "mainFileActionInput")
private WebElement fileInput;
И вот здесь я застрял - как же реализовать эту проверку на StaleElementReferenceException в afterFindBy? Или все же придется писать свой класс со всеми действиями для элеметов, где будет
проверка на StaleElementReferenceException?
Хотел посмотреть как это реализовано в Selenide, но навыков программирования, к сожалению, пока не хватает чтобы разобраться.