Обработка StaleElementReferenceException в методе afterFindBy

Решаю вопрос с ненавистной ошибкой 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, но навыков программирования, к сожалению, пока не хватает чтобы разобраться.

Попробуйте библиотеку Selenide, там это уже сделано. При совершении любой операции или проверки она ловит StaleElementException и пробует заново (по умолчанию до 4 секунд).

2 лайка

Да, вот уже первый день пробую (отправил, кстати, Андрей вопрос по e-mail) :blush:

Все же интересно - насколько я далек от истины в решении проблемы?

А почему удалили сообщение? Меня это интересует - у селенида имеются проблемы с обработкой StaleElementException?

Раньше были - “закрыли” в марте 2015

1 лайк

Респект хакеру!
Действительно, была такая проблема. Если ещё найдёшь - смело кидайся багами!