Загрузка Ajax элементов в Selenium (Java)

148
22 февраля 2018, 14:09

Здравсвуйте, использую Selenium (Java). Проект активно использует Ajax. Проблема в том, что во многих местах приходится стаить команду Thread.sleep (4000) чтобы все элементы могли загрузиться на страницу. Искал в интернете пример кода чтобы все элементы Ajax загрузились на страницу и только потом выполнять дальнейшие действия. Не могу понять как это работает. Я новичок в Java поэтому сложновато. Аытался использовать вот этот код: `public boolean waitForAjax() {

WebDriverWait wait = new WebDriverWait(driver, 30);
ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
  @Override
  public Boolean apply(WebDriver driver) {
    try {
      return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0);
    }
    catch (Exception e) {
      return true;
    }
  }
};

ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
  @Override
  public Boolean apply(WebDriver driver) {
    return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState")
    .toString().equals("complete");
  }
};

return wait.until(jQueryLoad) && wait.until(jsLoad); }`

но ничего не получилось.

Сегодня сделал обходной вариант типа ExpectedConditions, и использую опции InvisibilityOfElementLocated, ElementToBeClickable. Но работает через раз. Хотелось бы пприменить код чтобы ждал полную загрузку Ajax элементов и только после этого выполнялись все действия.

Если кто знает, помогите с кодом. Спасибо!

Answer 1

Согласно документации есть 2 способа ожидания:
1. явный (по событиям, условиям)

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

Список условий можно найти тут
2. неявный (ожидания выполнения всех скриптов и загрузок)

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = 
driver.findElement(By.id("myDynamicElement"));
READ ALSO
Cron изменение значение через БД

Cron изменение значение через БД

Всем привет! Необходимо реализовать cron который будет запускать потоки в определенное времяНо время запуска должно задаваться удаленно,...

135
Обновление foreign key в hibernate

Обновление foreign key в hibernate

При старте приложения hibernate почему-то всегда обновляет внешний ключ

191
реализация задачи Java

реализация задачи Java

Не хватает опыта для реализации задачи, прошу подскажите как быть

182
Получить объект Company через Hibernate

Получить объект Company через Hibernate

Добрый день! Подскажите, как выполнить такой запрос с помощью Hibernate

193