Ожидания
Ожидания - непременный атрибут любых UI тестов для динамических приложений. Нужны они для синхронизации работы AUT и тестового скрипта. Скрипт выполняется намного быстрее реакции приложения на команды, поэтому часто в скриптах необходимо дожидаться определенного состояния приложения для дальнейшего с ним взамодействия.
Самый просто пример - переход по ссылке и нажатие кнопки:
driver.get("http://google.com");
driver.findElement(By.id("element_id")).click();
В данном случае необходимо дождаться пока не появится кнопка с id = element_id и только потом совершать действия над ней. Для этого и существуют ожидания.
Ожидания бывают:
Неявные ожидания - 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);
- Явные ожидания - Explicit Waits - это код, который ждет наступления какого-то события (чаще всего на AUT), прежде чем продолжит выполнение команд скрипта. Такое ожидание срабатывает один раз в указанном месте.
Самым худшим вариантом является использование
Thread.sleep(1000)
, в случае с которым скрипт просто будет ждать определенное количество времени. Это не гарантирует наступление нужного события либо будет слишком избыточным и увеличит время выполнения теста.</p>Более предпочтительно использовать WebDriverWait и ExpectedCondition:
В данном случае скрипт будет ждать элемента c id = dynamicElement_id в течении 10 секунд, но продолжит выполнение, как только элемент будет найден. При этом WebDriverWait класс выступает в роли конфигурации ожидания - задаем, как долго ждать события и как часто проверять его наступление. ExpectedConditions - статический класс, содержащий часто используемые условия для ожидания.WebDriver driver = new FirefoxDriver(); driver.get("http://some_url"); WebElement dynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("dynamicElement_id")));