WebDriver не использует последний источник страницы - PullRequest
1 голос
/ 08 февраля 2012

У меня возникают проблемы при выполнении тестов Selenium 2.18 WebDriver для сайта на базе Oracle SSXA, который преобразуется в тонны всплывающих окон, контента, загруженного Ajax, и фреймов. Для данной страницы, основанной на ручном наблюдении, страница изначально загружается с пустым диапазоном sslw_doc_content_id (без текста). Примерно через секунду промежуток все еще существует и содержит текст.

Чтобы убедиться, что эта страница загружена, я использую WebDriverWait с предикатом, который проверяет наличие в пустом тексте диапазона sslw_doc_content_id:

new Predicate<WebDriver>() {
    @Override
    public boolean apply(final WebDriver input) {
        return StringUtils.isNotEmpty(input.findElement(By.id("sslw_doc_content_id")).getText());
    }
}

Каким-то образом WebDriver всегда находит WebElement, но всегда возвращает пустую строку при вызове WebElement.getText (). И поэтому этот предикат всегда оценивается как ложный.

Проверка страницы с помощью Chrome или Firefox показывает, что элемент существует и имеет текст. При отладке предиката я заметил, что input.getPageSource () содержит span без текста при первом вызове, но input.getPageSource () содержит span с некоторым текстом при втором вызове (после того, как страница была ajax). -refreshed).

Почему WebDriver не учитывает обновленный источник страницы при втором вызове?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

Оказывается, что WebDriver не разрешает доступ к скрытым элементам, и этот промежуток был скрыт.

http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_Why_is_it_not_possible_to_interact_with_hidden_elements?

Я прибег к использованию решения на основе JavaScript, описанного в приведенной выше ссылке.

0 голосов
/ 09 февраля 2012

Вы можете попробовать цикл:

int seconds = 0;
for (int seconds =0; seconds<30; seconds++) {
      if (apply(driver)){
        break;
        }
      Thread.sleep(1000);         
}

Вышеупомянутый цикл будет проверять каждую секунду, есть ли текст, и делать это в течение 30 секунд.Если он найдет его, он выйдет из цикла.Вы все еще можете добавить еще одну проверку после:

if (!apply(driver)){
  throw new RuntimeException("Expected text still not there");
}

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

for (int seconds =0; seconds<30; seconds++){
 try{
 driver.findElement(By.id("lastelementonpage"));
}catch (Exception e){
 Thread.sleep(1000);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...