Selenium Зачекайте – неявний і явний із синтаксисом


In Selenium, «Очікування» відіграють важливу роль у виконанні тестів. У цьому посібнику ви дізнаєтеся про різні аспекти та різницю між неявним і явним очікуванням Selenium.

Чому нам потрібні очікування Selenium?

Більшість веб-додатків розроблено з використанням Ajax та Javascript. Коли веб-переглядач завантажує сторінку, елементи, з якими ми хочемо взаємодіяти, можуть завантажуватися через різні проміжки часу.

Мало того, що це ускладнює ідентифікацію елемента, але також якщо елемент не знайдено, він видасть "ElementNotVisibleException” виключення. Використання Selenium Зачекайте, ми можемо вирішити цю проблему.

Давайте розглянемо сценарій, коли ми повинні використовувати як неявне, так і явне очікування в нашому тесті. Припустімо, що неявний час очікування встановлено на 20 секунд, а явний час очікування встановлено на 10 секунд.

Припустімо, ми намагаємося знайти елемент, який має деякі “Очікувані умови «(Явне очікування), якщо елемент не знаходиться в межах часу, визначеного явним очікуванням (10 секунд), він використовуватиме часовий проміжок, визначений неявним очікуванням (20 секунд), перш ніж видавати «ElementNotVisibleException».

Selenium Веб-драйвер чекає

  1. Неявне очікування
  2. Явне очікування

У цьому посібнику ви дізнаєтесь про різні типи очікування Selenium:

Неявне очікування Selenium

Команда Неявне очікування Selenium використовується, щоб наказати веб-драйверу зачекати певний проміжок часу, перш ніж викине повідомлення «Немає винятку такого елемента». Значення за замовчуванням — 0. Коли ми встановимо час, веб-драйвер чекатиме елемент протягом цього часу, перш ніж викинути виняток.

Selenium Web Driver запозичив ідею неявного очікування з Watir.

У наведеному нижче прикладі ми оголосили неявне очікування з інтервалом часу 10 секунд. Це означає, що якщо елемент не буде розміщено на веб-сторінці протягом цього періоду часу, він викличе виняток.

Щоб оголосити неявне очікування Selenium WebDriver:

Неявний синтаксис очікування:

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
package 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 {
	
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	//close browser
	driver.close();
}
}

Пояснення Кодексу

У наведеному вище прикладі

Розгляньте наступний код:

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

Неявне очікування прийматиме 2 параметри, перший параметр прийматиме час як ціле число, а другий параметр прийматиме вимірювання часу в термінах СЕКУНД, ХВИЛИН, МІЛІСЕКУНД, МІКРОСЕКУНД, НАНОСЕКУНД, ДНІВ, ГОДИН тощо.

Явне очікування Selenium

Команда Явне очікування Selenium використовується, щоб повідомити веб-драйверу зачекати певних умов (очікуваних умов) або перевищити максимальний час, перш ніж створювати виняток «ElementNotVisibleException». Це інтелектуальний тип очікування, але його можна застосувати лише для певних елементів. Він надає кращі параметри, ніж неявне очікування, оскільки він очікує динамічно завантажуваних елементів Ajax.

Як тільки ми оголосимо явне очікування, ми повинні використовувати "Очікувані умови” або ми можемо налаштувати частоту перевірки умови за допомогою Вільно зачекайте. У ці дні під час впровадження ми використовуємо Thread.Sleep() як правило, не рекомендується використовувати

У наведеному нижче прикладі ми створюємо еталонне очікування для "WebDriverWait" клас і створення екземпляра за допомогою "веб-драйвер», і ми надаємо максимальний часовий проміжок 20 секунд.

Явний синтаксис очікування:

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
package 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 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	WebDriverWait wait=new WebDriverWait(driver, 20);
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	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" клас або "Очікувані умови” в залежності від того, що відбудеться раніше.

Вище Java код повідомляє, що ми очікуємо на елемент протягом періоду часу 20 секунд, як визначено в "WebDriverWait" на веб-сторінці, поки не з'явиться "Очікувані умови" виконуються, а умова "visibilityofElementLocated».

Нижче наведено очікувані умови, у яких можна використовувати Selenium Явне очікування

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. присутністьВсіхЕлементів, розташованих()
  9. присутністьОфЕлементРозташований()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleContains()
  15. visibilityOf()
  16. visibilityOfAllElements()
  17. visibilityOfAllElementsLocatedBy()
  18. visibilityOfElementLocated()

Вільно Зачекайте Selenium

Команда Вільно Зачекайте Selenium використовується для визначення максимального часу очікування веб-драйвером умови, а також частоти, з якою ми хочемо перевірити умову перед тим, як створити виняток «ElementNotVisibleException». Він перевіряє веб-елемент через регулярні проміжки часу, доки об’єкт не буде знайдено або не настане тайм-аут.

частота: Налаштування циклу повторення з часовими рамками для підтвердження/перевірки стану через регулярний проміжок часу

Давайте розглянемо сценарій, коли елемент завантажується з різними інтервалами часу. Елемент може завантажуватися протягом 10 секунд, 20 секунд або навіть більше, ніж якщо ми оголосимо явне очікування 20 секунд. Він чекатиме до вказаного часу, перш ніж створювати виняток. У таких сценаріях плавне очікування є ідеальним для використання, оскільки воно намагатиметься знайти елемент на іншій частоті, поки не знайде його або поки не закінчиться останній таймер.

Синтаксис Fluent Wait:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);

Наведений вище код застарів Selenium v3.11 і вище. Вам потрібно використовувати

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(Duration.ofSeconds(SECONDS))
.pollingEvery(Duration.ofSeconds(SECONDS))
.ignoring(Exception.class);

package 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 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	driver = new ChromeDriver();
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
		}
	
	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
			.withTimeout(30, TimeUnit.SECONDS) 			
			.pollingEvery(5, TimeUnit.SECONDS) 			
			.ignoring(NoSuchElementException.class);
	WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){
	
		public WebElement apply(WebDriver driver ) {
			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"));
		}
	});
	//click on the selenium link
	clickseleniumlink.click();
	//close~ browser
	driver.close() ;
	}
}

Пояснення Кодексу

Розгляньте наступний код:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
	.withTimeout(30, TimeUnit.SECONDS) 			
	.pollingEvery(5, TimeUnit.SECONDS) 			
	.ignoring(NoSuchElementException.class);				

У наведеному вище прикладі ми оголошуємо плавне очікування з тайм-аутом 30 секунд, а частоту встановлюємо на 5 секунд, ігноруючи «NoSuchElementException"

Розгляньте наступний код:

public WebElement apply(WebDriver driver) {
        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 Підручник IDE для початківців

Різниця між неявним очікуванням і явним очікуванням

Нижче наведена основна відмінність між неявним очікуванням і явним очікуванням Selenium:

Неявне очікування Явне очікування
Неявний час очікування застосовується до всіх елементів у сценарії Явний час очікування застосовується лише до тих елементів, які ми запланували
У Implicit Wait нам потрібно НЕ вкажіть “ExpectedConditions” для елемента, який потрібно знайти У Explicit Wait нам потрібно вказати «ExpectedConditions» для елемента, який потрібно знайти
Рекомендується використовувати, коли елементи розташовані з часовими рамками, зазначеними в Selenium неявне очікування Рекомендується використовувати, коли завантаження елементів займає багато часу, а також для перевірки властивості елемента, наприклад (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Висновок

Неявне, явне та вільне очікування – це різні способи очікування, які використовуються в Selenium. Використання цих очікувань повністю базується на елементах, які завантажуються в різні проміжки часу. Завжди не рекомендується використовувати Thread.Sleep() під час Тестування нашої програми або створення нашої структури.

Також перевірте: - Selenium Посібник для початківців: Вивчіть WebDriver за 7 днів

Детальніше ЧИТАТИ