Selenium - несогласованные ошибки StaleElementReference

58
6

Я пишу тесты Java Selenium для listviews, в частности, для проверки, а затем выберите элемент из списка.

Это сводит меня с ума, хотя, поскольку тесты будут выполняться в течение половины времени, но в другой половине они будут давать StaleElementReference или подобные ошибки, часто возникающие на разных этапах каждый раз. Это при запуске их при одинаковых условиях.

Я переписываю переменные WebElement каждый раз, когда изменяется страница списка, как я понял, это может быть проблемой, но это все еще происходит. Затем я подумал, что это может быть связано с необходимостью дожидаться загрузки страницы, но я не совсем уверен, как использовать такие вещи, как WebDriverWait, которые я видел, как некоторые другие предлагают. Однако я знаю, что наш существующий класс объектов базовых страниц уже содержит что-то для ожидания, поэтому я думаю, что это может быть уже рассмотрено:

    public abstract class PageObject {

protected WebDriver driver;
protected WebDriverWait wait;
...
public PageObject(WebDriver driver, String relativePath) {
...
this.driver = driver;
this.wait = new WebDriverWait(driver, 8);
...

Достаточно ли этого, или мне нужна более конкретная форма "ждать" этой проблемы?

Помимо этого, может ли кто-нибудь подумать о любых возможных общих проблемах, которые могут быть причиной этого?

большое спасибо

спросил(а) 2012-10-10T14:42:00+04:00 8 лет назад
1
Решение
71

хе, сталкиваются с подобной проблемой. Дело в том, что вы получили много AJAX на странице, лучший способ (imho), чтобы справиться с этим, и ожидание, которое мне больше нравится, - fluentWait()

 public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(1, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);

WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo;
};

Поэтому вам действительно нужно найти локатор веб-элемента (xpath или css-селектор) и передать его в свободное состояние. И беглое ожидание, в свою очередь, возвращает найденный веб-элемент. Из документации: реализация интерфейса Wait, которая может иметь свой тайм-аут и интервал опроса, настроенный "на лету". Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки состояния. Кроме того, пользователь может настроить wait для игнорирования определенных типов исключений во время ожидания, например NoSuchElementExceptions при поиске элемента на странице. Применение:

String xPathElement =".....blablabla...";
WebElement neededElement =fluentWait(By.xpath(xPathElement));
neededElement.click();
//neededElement.getText().trim();

вы можете получить дополнительную информацию об этом здесь

Проблема, вызывающая такую проблему, может быть (по моему опыту) двух типов: 1) первая

вы взаимодействуете с элементом, вызывающим отрисовку страницы или некоторые "медленные" операции. Тесты Selenium продолжаются, но страница на самом деле не отображается >> staleElement.

2) второй. вы взаимодействуете с одним элементом. то вы взаимодействуете с другим, вызывая много AJAX (не полная перезагрузка страницы и обновление первого элемента). и мгновенно вы вернетесь к предыдущему (захотите, например, getText или нажмите) >> staleElement.

Поэтому я всегда использую свободное время. Удобно с точки зрения, что вы можете запретить исключение арбитражных исключений. Надеюсь, что это работает для вас.

ответил(а) 2012-10-10T18:40:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема