Ожидания

Ожидания - непременный атрибут любых UI тестов для динамических приложений. Нужны они для синхронизации работы AUT и тестового скрипта. Скрипт выполняется намного быстрее реакции приложения на команды, поэтому часто в скриптах необходимо дожидаться определенного состояния приложения для дальнейшего с ним взамодействия.

Самый просто пример - переход по ссылке и нажатие кнопки:

driver.get("http://google.com");
driver.findElement(By.id("element_id")).click();

В данном случае необходимо дождаться пока не появится кнопка с id = element_id и только потом совершать действия над ней. Для этого и существуют ожидания.

Ожидания бывают:

  1. Неявные ожидания - Implicit Waits - конфигурируют экземпляр WebDriver делать многократные попытки найти элемент (элементы) на странице в течении заданного периода времени, если элемент не найден сразу. Tолько по истечении этого времени WebDriver бросит ElementNotFoundException.

     WebDriver driver = new FirefoxDriver();
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
     driver.get("http://some_url");
     WebElement dynamicElement = driver.findElement(By.id("dynamicElement_id"));
    

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

     driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    

    А также неявное ожидание отработки скриптов:

     driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
    
  2. Явные ожидания - Explicit Waits - это код, который ждет наступления какого-то события (чаще всего на AUT), прежде чем продолжит выполнение команд скрипта. Такое ожидание срабатывает один раз в указанном месте.

    Самым худшим вариантом является использование Thread.sleep(1000), в случае с которым скрипт просто будет ждать определенное количество времени. Это не гарантирует наступление нужного события либо будет слишком избыточным и увеличит время выполнения теста.</p>

    Более предпочтительно использовать WebDriverWait и ExpectedCondition:

    WebDriver driver = new FirefoxDriver();
    driver.get("http://some_url");
    WebElement dynamicElement = (new WebDriverWait(driver, 10))
    .until(ExpectedConditions.presenceOfElementLocated(By.id("dynamicElement_id")));
    
    В данном случае скрипт будет ждать элемента c id = dynamicElement_id в течении 10 секунд, но продолжит выполнение, как только элемент будет найден. При этом WebDriverWait класс выступает в роли конфигурации ожидания - задаем, как долго ждать события и как часто проверять его наступление. ExpectedConditions - статический класс, содержащий часто используемые условия для ожидания.