Selenium Ожидание – неявное, явное и плавное ожидание


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

Зачем нам нужно ожидание Selenium?

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

Это не только затрудняет идентификацию элемента, но и если элемент не найден, выдается сообщение «Элементнотвидиблисключение" исключение. С использованием Selenium Подождите, мы можем решить эту проблему.

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

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

Selenium Веб-драйвер ждет

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

В этом уроке вы узнаете о различных типах ожидания в Selenium:

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

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

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

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

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

Синтаксис неявного ожидания:

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 параметра: первый параметр принимает время как целое значение, а второй параметр принимает измерение времени в СЕКУНДАХ, МИНУТАХ, МИЛИСЕКУНДАХ, МИКРОСЕКОНДАХ, НАНОСЕКУНДАХ, ДНЯХ, ЧАСАХ и т. д.

Явное ожидание 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("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();

В этом примере ожидания WebDriver подождите время, определенное в параметре «WebDriverWait” класс или “Ожидаемые условияпроизойдет в зависимости от того, что произойдет раньше.

Приведенные выше Java В коде указано, что мы ожидаем элемент в течение периода времени 20 секунд, как определено в «WebDriverWait” на веб-странице до тех пор, пока не появится “Ожидаемые условия” выполняются, и условие “видимостьЭлементЛокед».

Ниже приведены ожидаемые условия, которые можно использовать в Selenium Явное ожидание

  1. оповещение присутствует ()
  2. элементSelectionStateToBe()
  3. элементToBeClickable()
  4. элементToBeSelected()
  5. фреймToBeAvaliableAndSwitchToIt()
  6. невидимостьOfTheElementLocated()
  7. невидимостьOfElementWithText()
  8. присутствиеOfAllElementsLocatedBy()
  9. присутствиеОфЭлементЛокед()
  10. текстToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. заголовокIs()
  14. заголовокСодержит()
  15. видимостьOf()
  16. видимостьОфВсеЭлементы()
  17. видимостьOfAllElementsLocatedBy()
  18. видимостьOfElementLocated()

Свободное ожидание Selenium

" Свободное ожидание Selenium используется для определения максимального времени ожидания веб-драйвером условия, а также частоты, с которой мы хотим проверять условие перед выдачей исключения «ElementNotVisibleException». Он проверяет наличие веб-элемента через регулярные промежутки времени, пока объект не будет найден или не истечет время ожидания.

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

Давайте рассмотрим сценарий, в котором элемент загружается через разные промежутки времени. Элемент может загрузиться в течение 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"));

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

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

Также проверьте: - Selenium Учебное пособие по IDE для начинающих

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

Ниже приведено основное различие между неявным и явным ожиданием. Selenium:

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

Заключение

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

Также проверьте: - Selenium Учебник для начинающих: изучите WebDriver за 7 дней

Читать прочитайте больше