Selenium Изчакване – имплицитно, явно и свободно изчакване


In Selenium, „Чакането“ играе важна роля при изпълнението на тестове. В този урок ще научите различни аспекти и разлика между имплицитно и явно изчакване Selenium.

Защо се нуждаем от чакане Selenium?

Повечето уеб приложения са разработени с помощта на Аякс намлява Javascript. Когато една страница се зарежда от браузъра, елементите, с които искаме да взаимодействаме, могат да се зареждат на различни интервали от време.

Това не само затруднява идентифицирането на елемента, но също така, ако елементът не е локализиран, ще изведе „ElementNotVisibleException” изключение. Използване Selenium Чакай, можем да разрешим този проблем.

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

Да предположим, че се опитваме да намерим елемент, който има някои „Очаквани условия „(Явно изчакване), ако елементът не се намира в рамките на времевата рамка, определена от изричното изчакване (10 секунди), той ще използва времевата рамка, дефинирана от неявното изчакване (20 секунди), преди да хвърли „ElementNotVisibleException".

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” на уеб страницата до „Очаквани условия” са изпълнени и условието е „visibilityofElementLocated".

По-долу са очакваните условия, при които може да се използва Selenium Изрично изчакайте

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. присъствиеНаВсичкиЕлементиLocatedBy()
  9. присъствиеОфЕлементLocated()
  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("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 секунди. Ако елементът се намира в рамките на тази времева рамка, той ще извърши операциите, в противен случай ще хвърли „ElementNotVisibleException"

Също така проверете: - Selenium Урок за IDE за начинаещи

Разлика между имплицитно изчакване срещу явно изчакване

Следва основната разлика между имплицитно изчакване и изрично изчакване Selenium:

Неявно изчакайте Изрично изчакайте
Неявното време за изчакване се прилага към всички елементи в скрипта Изричното време за изчакване се прилага само за онези елементи, които сме предвидили
В Implicit Wait имаме нужда не посочете „ExpectedConditions“ на елемента, който трябва да бъде локализиран В Explicit Wait трябва да посочим „ExpectedConditions“ на елемента, който трябва да бъде локализиран
Препоръчително е да се използва, когато елементите са разположени с времевата рамка, посочена в Selenium имплицитно изчакване Препоръчително е да се използва, когато зареждането на елементите отнема много време, а също и за проверка на свойството на елемента като (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Заключение

Implicit, Explicit и Fluent Wait са различните чакания, използвани в Selenium. Използването на тези чакания се основава изцяло на елементите, които се зареждат на различни интервали от време. Винаги не се препоръчва да използвате Thread.Sleep(), докато Тестване нашето приложение или изграждане на нашата рамка.

Също така проверете: - Selenium Урок за начинаещи: Научете WebDriver за 7 дни