В Selenium «ожидания» играют важную роль в выполнении тестов. В этом руководстве вы изучите различные аспекты как «неявного», так и «явного» ожидания в Selenium.
В этом руководстве вы узнаете:
- Зачем нужны ожидания в селене?
- Неявное ожидание
- Явное ожидание
- Беглое ожидание
Зачем нужны ожидания в селене?
Большинство веб-приложений разрабатываются с использованием Ajax и Javascript. Когда страница загружается браузером, элементы, с которыми мы хотим взаимодействовать, могут загружаться через разные промежутки времени.
Это не только затрудняет идентификацию элемента, но также, если элемент не расположен, это вызовет исключение « ElementNotVisibleException ». Используя Selenium Waits, мы можем решить эту проблему.
Давайте рассмотрим сценарий, в котором мы должны использовать в нашем тесте как неявное, так и явное ожидание. Предположим, что неявное время ожидания установлено на 20 секунд, а явное время ожидания установлено на 10 секунд.
Предположим, мы пытаемся найти элемент, который имеет некоторые «ожидаемые условия » (явное ожидание). Если элемент не находится в пределах временного интервала, определенного явным ожиданием (10 секунд), он будет использовать временные рамки, определенные неявным ожиданием ( 20 секунд), прежде чем выбросить « ElementNotVisibleException ».
Selenium Web Driver ждет
- Неявное ожидание
- Явное ожидание
Неявное ожидание в Selenium
Неявная Wait в Селене используется , чтобы сообщить веб - водителю подождать определенное количество времени , прежде чем он не бросает «Нет такой элемент Exception». Значение по умолчанию - 0. После того, как мы установим время, веб-драйвер будет ждать элемента в течение этого времени, прежде чем генерировать исключение.
Selenium Web Driver позаимствовал идею неявного ожидания у Watir.
В приведенном ниже примере мы объявили неявное ожидание с временным интервалом 10 секунд. Это означает, что если элемент не находится на веб-странице в течение этого периода времени, он вызовет исключение.
Чтобы объявить неявное ожидание:
Синтаксис :
driver.manage (). timeouts (). implicitlyWait (TimeOut, TimeUnit.SECONDS);
пакет guru.test99;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.testng.annotations.Test;public class AppTest {защищенный драйвер WebDriver;@Тестpublic void guru99tutorials () выбрасывает InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");драйвер = новый ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);String eTitle = "Демо-страница Guru99";Строка aTitle = "";// запускаем Chrome и перенаправляем его на базовый URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Разворачивает окно браузераdriver.manage (). window (). maximize ();// получаем актуальное значение заголовкаaTitle = driver.getTitle ();// сравниваем фактический заголовок с ожидаемым заголовкомесли (aTitle.equals (eTitle)){System.out.println («Тест пройден»);}еще {System.out.println («Тест не пройден»);}// закрываем браузерdriver.close ();}}
Объяснение кода
В приведенном выше примере
Рассмотрим следующий код:
driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);
Неявное ожидание будет принимать 2 параметра, первый параметр будет принимать время как целое число, а второй параметр будет принимать измерения времени в единицах СЕКУНД, МИНУТ, МИЛИСЕКУНД, МИКРОСЕКУНД, НАНОСЕКУНД, ДНЕЙ, ЧАСОВ и т. Д.
Явное ожидание в Selenium
Явная Wait в Селен используется , чтобы сообщить Web Driver ждать определенных условий (ожидаемых условий) или максимальное время превышены перед броском «ElementNotVisibleException» исключение. Это интеллектуальный вид ожидания, но он может применяться только для определенных элементов. Это дает лучшие возможности, чем неявное ожидание, поскольку оно ожидает динамически загружаемых элементов Ajax.
Как только мы объявляем явное ожидание, мы должны использовать « ExpectedConditions » или можем настроить, как часто мы хотим проверять условие, используя Fluent Wait . В наши дни при реализации мы используем Thread.Sleep (), как правило, не рекомендуется использовать
В приведенном ниже примере, мы создаем ссылочный ожидание « WebDriverWait класса» и инстанцировании с помощью « WebDriver » ссылка, и мы даем максимальный временной интервал в 20 секунд.
Синтаксис:
WebDriverWait wait = новый WebDriverWait (WebDriverRefrence, TimeOut);
пакет guru.test99;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;public class AppTest2 {защищенный драйвер WebDriver;@Тестpublic void guru99tutorials () выбрасывает InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");драйвер = новый ChromeDriver ();WebDriverWait wait = новый WebDriverWait (драйвер, 20);String eTitle = "Демо-страница Guru99";Строка aTitle = "";// запускаем Chrome и перенаправляем его на базовый URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Разворачивает окно браузераdriver.manage (). window (). maximize ();// получаем актуальное значение заголовкаaTitle = driver.getTitle ();// сравниваем фактический заголовок с ожидаемым заголовкомесли (aTitle.contentEquals (eTitle)){System.out.println («Тест пройден»);}еще {System.out.println («Тест не пройден»);}WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i »)));guru99seleniumlink.click ();}}
Объяснение кода
Рассмотрим следующий код:
WebElement guru99seleniumlink;guru99seleniumlink = wait.until (ExpectedConditions.visibilityOfElementLocated (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i »)));guru99seleniumlink.click ();
В этом примере ожидания WebDriver дождитесь наступления времени, определенного в классе « WebDriverWait » или « ExpectedConditions », в зависимости от того, что произойдет раньше.
В приведенном выше коде Java говорится, что мы ожидаем элемента в течение 20 секунд, как определено в классе « WebDriverWait » на веб-странице, пока не будут выполнены « ExpectedConditions » и условие « visibilityofElementLocated ».
Ниже приведены ожидаемые условия, которые можно использовать в явном ожидании Selenium.
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- присутствиеOfAllElementsLocatedBy ()
- присутствиеOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visibilityOf ()
- visibilityOfAllElements ()
- visibilityOfAllElementsLocatedBy ()
- visibilityOfElementLocated ()
Свободное ожидание в Selenium
Свободный Wait в Selenium используется для определения максимального времени для веб - водителя ждать состояния, а также от частоты , с которой мы хотим проверить состояние до выбрасывания «ElementNotVisibleException» исключение. Он проверяет наличие веб-элемента через регулярные промежутки времени, пока объект не будет найден или не истечет время ожидания.
Частота: настройка цикла повторения с указанием временных рамок для проверки / проверки состояния через равные промежутки времени.
Рассмотрим сценарий, в котором элемент загружается через разные промежутки времени. Элемент может загрузиться в течение 10 секунд, 20 секунд или даже больше, если мы объявим явное ожидание в 20 секунд. Он будет ждать до указанного времени, прежде чем генерировать исключение. В таких сценариях плавное ожидание является идеальным для использования, так как оно будет пытаться найти элемент с другой частотой, пока не найдет его или пока не закончится последний таймер.
Синтаксис:
Подождите, подождите = новый FluentWait (ссылка на WebDriver).withTimeout (тайм-аут, СЕКУНДЫ).pollingEvery (тайм-аут, СЕКУНДЫ).ignoring (Exception.class);
Приведенный выше код устарел в Selenium v3.11 и выше. Вам нужно использовать
Подождите, подождите = новый FluentWait (ссылка на WebDriver).withTimeout (Продолжительность. секунд (СЕКУНДЫ)).pollingEvery (Продолжительность. секунд (СЕКУНДЫ)).ignoring (Exception.class);
пакет guru.test99;import org.testng.annotations.Test;import java.util.NoSuchElementException;import java.util.concurrent.TimeUnit;import java.util.function.Function;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.FluentWait;import org.openqa.selenium.support.ui.Wait;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.annotations.Test;public class AppTest3 {защищенный драйвер WebDriver;@Тестpublic void guru99tutorials () выбрасывает InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Демо-страница Guru99";Строка aTitle = "";драйвер = новый ChromeDriver ();// запускаем Chrome и перенаправляем его на базовый URLdriver.get ("http://demo.guru99.com/test/guru99home/");// Разворачивает окно браузераdriver.manage (). window (). maximize ();// получаем актуальное значение заголовкаaTitle = driver.getTitle ();// сравниваем фактический заголовок с ожидаемым заголовкомесли (aTitle.contentEquals (eTitle)){System.out.println («Тест пройден»);}еще {System.out.println («Тест не пройден»);}Waitwait = new FluentWait (драйвер).withTimeout (30; Единица времени. СЕКУНДЫ).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (новая функция () {общедоступный WebElement применить (драйвер WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2 ] / div [2] / div / div / div / div / div [1] / div / div / a / i »));}});// щелкаем ссылку селеномclickseleniumlink.click ();// закрываем браузерdriver.close ();}}
Объяснение кода
Рассмотрим следующий код:
Waitwait = new FluentWait (драйвер).withTimeout (30; Единица времени. СЕКУНДЫ).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);
В приведенном выше примере мы объявляем плавное ожидание с таймаутом 30 секунд, а частота установлена на 5 секунд, игнорируя " NoSuchElementException "
Рассмотрим следующий код:
общедоступный WebElement применить (драйвер WebDriver) {return driver.findElement (By.xpath ("/ html / body / div [1] / section / div [2] / div / div [1] / div / div [1] / div / div / div / div [2 ] / div [2] / div / div / div / div / div [1] / div / div / a / i »));
Мы создали новую функцию для идентификации веб-элемента на странице. (Пример: здесь веб-элемент - это не что иное, как ссылка на Selenium на веб-странице).
Частота установлена на 5 секунд, а максимальное время установлено на 30 секунд. Таким образом, это означает, что он будет проверять наличие элемента на веб-странице каждые 5 секунд в течение максимального времени 30 секунд. Если элемент находится в пределах этого времени он будет выполнять операции иначе он будет бросать « ElementNotVisibleException »
Разница между неявным ожиданием и явным ожиданием
Неявное ожидание | Явное ожидание |
---|---|
|
|
|
|
|
|
Вывод:
Неявное, явное и плавное ожидание - это разные типы ожидания, используемые в Selenium. Использование этих ожиданий полностью основано на элементах, которые загружаются с разными интервалами времени. Всегда не рекомендуется использовать Thread.Sleep () при тестировании нашего приложения или создании нашего фреймворка.
Автор статьи: Чайтанья Пуджари.