Учебники

66) Явное и явное

В селене «Waits» играют важную роль в выполнении тестов. В этом уроке вы изучите различные аспекты ожидания «неявного» и «явного» в Selenium.

В этом уроке вы узнаете

Зачем нам ждать в селене?

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

Это не только затрудняет идентификацию элемента, но также, если элемент не находится, он вызывает исключение « ElementNotVisibleException ». Используя Waits, мы можем решить эту проблему.

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

Предположим, что мы пытаемся найти элемент, который имеет некоторые «ExpectedConditions » (явное ожидание). Если элемент не находится в пределах периода времени, определенного явным ожиданием (10 секунд), он будет использовать период времени, определенный неявным ожиданием ( 20 секунд), прежде чем выдать « ElementNotVisibleException ».

Selenium Web Driver ждет

  1. Неявное ожидание
  2. Явное ожидание

Неявное ожидание

Selenium Web Driver заимствовал идею неявного ожидания от Watir.

Неявное ожидание скажет веб-драйверу подождать определенное количество времени, прежде чем он выдаст «Нет такого исключения элемента». Значение по умолчанию равно 0. Как только мы установим время, веб-драйвер будет ждать этого времени, прежде чем выдать исключение.

В приведенном ниже примере мы объявили неявное ожидание с периодом 10 секунд. Это означает, что если элемент не находится на веб-странице в течение этого периода времени, он выдаст исключение.

Чтобы объявить неявное ожидание:

Синтаксис :

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("http://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 параметра, первый параметр примет время как целочисленное значение, а второй параметр примет измерение времени в терминах СЕКУНД, МИНУТ, МИЛИСЕКУНД, МИКРОСЕКОНДОВ, НС, ДНЕЙ, ЧАСОВ и т. Д.

Явное ожидание

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

Явное ожидание — это интеллектуальное ожидание, но оно может применяться только для определенных элементов. Явное ожидание дает лучшие параметры, чем неявное ожидание, поскольку оно будет ожидать динамически загруженных элементов Ajax.

Как только мы объявляем явное ожидание, мы должны использовать « ExpectedCondtions », или мы можем настроить, как часто мы хотим проверять условие, используя Fluent Wait . В наши дни при реализации мы используем Thread.Sleep (), как правило, не рекомендуется использовать

В приведенном ниже примере, мы создаем ссылочный ожидание « WebDriverWait класса» и инстанцировании с помощью « WebDriver » ссылка, и мы даем максимальный временной интервал в 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("http://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();

In the above example, wait for the amount of time defined in the «WebDriverWait» class or the «ExpectedConditions» to occur whichever occurs first.

The above Java code states that we are waiting for an element for the time frame of 20 seconds as defined in the «WebDriverWait» class on the webpage until the «ExpectedConditions» are met and the condition is «visibilityofElementLocated«.

The following are the Expected Conditions that can be used in Explicit Wait

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presenceOfAllElementsLocatedBy()
  9. presenceOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleContains()
  15. visibilityOf()
  16. visibilityOfAllElements()
  17. visibilityOfAllElementsLocatedBy()
  18. visibilityOfElementLocated()

Fluent Wait

The fluent wait is used to tell the web driver to wait for a condition, as well as the frequency with which we want to check the condition before throwing an «ElementNotVisibleException» exception.

Frequency: Setting up a repeat cycle with the time frame to verify/check the condition at the regular interval of time

Давайте рассмотрим сценарий, в котором элемент загружается через разные промежутки времени. Элемент может загружаться в течение 10 секунд, 20 секунд или даже больше, чем если бы мы объявили явное ожидание в 20 секунд. Он будет ждать до указанного времени, прежде чем выдать исключение. В таких сценариях плавное ожидание является идеальным ожиданием для использования, так как оно будет пытаться найти элемент с различной частотой, пока не найдет его или не истечет окончательный таймер.

Синтаксис:

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("http://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"));				

Мы создали новую функцию для идентификации веб-элемента на странице. (Пример: здесь Web Element — это не что иное, как ссылка на селен на веб-странице).

Частота установлена ​​на 5 секунд, а максимальное время установлено на 30 секунд. Таким образом, это означает, что он будет проверять элемент на веб-странице каждые 5 секунд в течение максимального времени 30 секунд. Если элемент находится в пределах этого периода времени, он будет выполнять операции, иначе он выдаст « ElementNotVisibleException ».

Разница между неявным ожиданием и явным ожиданием

Неявное ожидание

Явное ожидание
  • Неявное время ожидания применяется ко всем элементам в скрипте
  • Явное время ожидания применяется только к тем элементам, которые мы намереваемся
  • В неявном ожидании нам не нужно указывать «ExpectedConditions» для элемента, который должен быть расположен
  • В явном ожидании нам нужно указать «ExpectedConditions» для элемента, который должен быть расположен
  • Рекомендуется использовать, когда элементы расположены с периодом времени, указанным в неявном ожидании
  • Рекомендуется использовать, когда загрузка элементов занимает много времени, а также для проверки свойства элемента, например (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Вывод:

Неявное, явное и свободное ожидание — это различные ожидания, используемые в селене. Использование этих ожиданий полностью основано на элементах, которые загружаются в разные промежутки времени. Всегда не рекомендуется использовать Thread.Sleep () при тестировании нашего приложения или создании нашей инфраструктуры.

Эта статья предоставлена ​​Чайтанья Пуджари