Ожидания

Last updated 5 months ago

Ожидания - непременный атрибут любых 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), прежде чем продолжит выполнение команд скрипта. Такое ожидание срабатывает один раз в указанном месте.</p>

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

Более предпочтительно использовать 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 - статический класс, содержащий часто используемые условия для ожидания.