Niejawne, jawne i & Płynne czekanie w Selenium WebDriver

Spisie treści:

Anonim

W Selenium „Waits” odgrywają ważną rolę w wykonywaniu testów. W tym samouczku nauczysz się różnych aspektów zarówno „niejawnego”, jak i „jawnego” oczekiwania w selenie.

W tym samouczku dowiesz się:

  • Dlaczego potrzebujemy czekania w selenie?
  • Niejawne oczekiwanie
  • Jawne oczekiwanie
  • Płynne czekanie

Dlaczego potrzebujemy czekania w selenie?

Większość aplikacji internetowych jest tworzona przy użyciu Ajax i Javascript. Kiedy strona jest ładowana przez przeglądarkę, elementy, z którymi chcemy wchodzić w interakcję, mogą ładować się w różnych odstępach czasu.

Nie tylko utrudnia to identyfikację elementu, ale także jeśli element nie jest zlokalizowany, zgłosi wyjątek „ ElementNotVisibleException ”. Korzystając z Selenium Waits, możemy rozwiązać ten problem.

Rozważmy scenariusz, w którym musimy użyć zarówno niejawnego, jak i jawnego oczekiwania w naszym teście. Załóżmy, że niejawny czas oczekiwania jest ustawiony na 20 sekund, a jawny czas oczekiwania jest ustawiony na 10 sekund.

Załóżmy, że próbujemy znaleźć element, który ma pewne „ExpectedConditions ” (jawne oczekiwanie). Jeśli element nie znajduje się w przedziale czasu zdefiniowanym przez jawne oczekiwanie (10 sekund), użyje ramy czasowej zdefiniowanej przez niejawne oczekiwanie ( 20 sekund) przed wyrzuceniem „ ElementNotVisibleException ”.

Selenium Web Driver czeka

  1. Niejawne oczekiwanie
  2. Jawne oczekiwanie

Niejawne oczekiwanie w selenie

Niejawny czekać w selen służy powiedzieć kierowcy internetową czekać przez pewien okres czasu, zanim wyrzuci „Brak takiego elementu Exception”. Domyślnym ustawieniem jest 0. Po ustawieniu czasu sterownik sieciowy będzie czekał na element przez ten czas, zanim wyrzuci wyjątek.

Selenium Web Driver pożyczył pomysł niejawnego oczekiwania od Watira.

W poniższym przykładzie zadeklarowaliśmy niejawne oczekiwanie z ramką czasową 10 sekund. Oznacza to, że jeśli element nie zostanie umieszczony na stronie w tym czasie, zgłosi wyjątek.

Aby zadeklarować niejawne oczekiwanie:

Składnia :

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 {chroniony sterownik WebDriver;@Testpublic void guru99tutorials () zgłasza InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");sterownik = nowy ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);String eTitle = "Strona Demo Guru99";String aTitle = "";// uruchom Chrome i przekieruj go do podstawowego adresu URLdriver.get („http://demo.guru99.com/test/guru99home/”);// Maksymalizuje okno przeglądarkidriver.manage (). window (). maximize ();// pobierz aktualną wartość tytułuaTitle = driver.getTitle ();// porównaj rzeczywisty tytuł z oczekiwanym tytułemif (aTitle.equals (eTitle)){System.out.println ("Test zakończony pomyślnie");}else {System.out.println ("Test nie powiódł się");}// zamknij przeglądarkędriver.close ();}}

Wyjaśnienie kodu

W powyższym przykładzie

Rozważ następujący kod:

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

Niejawne oczekiwanie przyjmie 2 parametry, pierwszy parametr przyjmie czas jako wartość całkowitą, a drugi parametr przyjmie pomiar czasu w postaci sekund, minut, milisekund, mikrosekund, nanosekund, dni, godzin itd.

Jawne oczekiwanie w selenie

Explicit czekać w selen służy powiedzieć kierowcy internetową czekać na pewnych warunkach (oczekiwane warunkach) lub maksymalnego czasu przekroczony przed wyrzuceniem „ElementNotVisibleException” wyjątek. Jest to inteligentny rodzaj czekania, ale można go zastosować tylko do określonych elementów. Daje lepsze opcje niż niejawne oczekiwanie, ponieważ czeka na dynamicznie ładowane elementy Ajax.

Po zadeklarowaniu jawnego oczekiwania musimy użyć „ ExpectedConditions ” lub możemy skonfigurować, jak często chcemy sprawdzać warunek za pomocą Fluent Wait . Obecnie podczas implementacji używamy Thread.Sleep () na ogół nie jest to zalecane

W poniższym przykładzie tworzenia oczekiwania odniesienia do „ WebDriverWait ” klasy i uruchamianiu pomocą „ WebDriver ” odniesienia, i dają maksymalny przedział czasu 20 sekund.

Składnia:

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 {chroniony sterownik WebDriver;@Testpublic void guru99tutorials () zgłasza InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");sterownik = nowy ChromeDriver ();WebDriverWait wait = nowy WebDriverWait (sterownik, 20);String eTitle = "Strona Demo Guru99";String aTitle = "";// uruchom Chrome i przekieruj go do podstawowego adresu URLdriver.get („http://demo.guru99.com/test/guru99home/”);// Maksymalizuje okno przeglądarkidriver.manage (). window (). maximize ();// pobierz aktualną wartość tytułuaTitle = driver.getTitle ();// porównaj rzeczywisty tytuł z oczekiwanym tytułemif (aTitle.contentEquals (eTitle)){System.out.println ("Test zakończony pomyślnie");}else {System.out.println ("Test nie powiódł się");}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 ();}}

Wyjaśnienie kodu

Rozważ następujący kod:

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 ();

W tym przykładzie oczekiwania WebDriver poczekaj, aż wystąpi czas zdefiniowany w klasie „ WebDriverWait ” lub „ ExpectedConditions ”, w zależności od tego, co nastąpi wcześniej.

Powyższy kod Java stwierdza, że ​​czekamy na element w przedziale czasowym 20 sekund, zgodnie z definicją w klasie „ WebDriverWait ” na stronie internetowej, do momentu spełnienia warunku „ ExpectedConditions ” i warunku „ visibilityofElementLocated ”.

Poniżej przedstawiono oczekiwane warunki, których można użyć w jawnym oczekiwaniu selenu

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

Płynne czekanie w selenie

Zaawansowany czekać w selen służy do określenia maksymalnego czasu dla kierowcy internetowej czekać na stan, a także częstotliwości, z jaką chcemy sprawdzić stan przed rzuca „ElementNotVisibleException” wyjątek. Sprawdza element sieciowy w regularnych odstępach czasu, aż do znalezienia obiektu lub przekroczenia limitu czasu.

Częstotliwość: ustawienie cyklu powtarzania z przedziałem czasowym w celu sprawdzenia / sprawdzenia stanu w regularnych odstępach czasu

Rozważmy scenariusz, w którym element jest ładowany w różnych odstępach czasu. Element może załadować się w ciągu 10 sekund, 20 sekund lub nawet dłużej, jeśli zadeklarujemy jawne oczekiwanie 20 sekund. Będzie czekał do określonego czasu przed rzuceniem wyjątku. W takich scenariuszach płynne oczekiwanie jest idealnym czasem oczekiwania, ponieważ będzie ono próbowało znaleźć element z różną częstotliwością, aż go znajdzie lub skończy się czas.

Składnia:

Czekaj, czekaj = nowy FluentWait (odniesienie do WebDriver).withTimeout (limit czasu, SECONDS).pollingEvery (limit czasu, SECONDS).ignoring (Exception.class);

Powyższy kod jest przestarzały w Selenium w wersji 3.11 i nowszych. Musisz użyć

Czekaj, czekaj = nowy FluentWait (odniesienie do WebDriver).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 {chroniony sterownik WebDriver;@Testpublic void guru99tutorials () zgłasza InterruptedException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Strona Demo Guru99";String aTitle = "";sterownik = nowy ChromeDriver ();// uruchom Chrome i przekieruj go do podstawowego adresu URLdriver.get („http://demo.guru99.com/test/guru99home/”);// Maksymalizuje okno przeglądarkidriver.manage (). window (). maximize ();// pobierz aktualną wartość tytułuaTitle = driver.getTitle ();// porównaj rzeczywisty tytuł z oczekiwanym tytułemif (aTitle.contentEquals (eTitle)){System.out.println ("Test zakończony pomyślnie");}else {System.out.println ("Test nie powiódł się");}Wait  wait = nowy FluentWait  (sterownik).withTimeout (30; TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (nowa funkcja  () {zastosowanie publicznego WebElement (sterownik 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 "));}});// kliknij link selenuclickseleniumlink.click ();// zamknij ~ przeglądarkędriver.close ();}}

Wyjaśnienie kodu

Rozważ następujący kod:

Wait  wait = nowy FluentWait  (sterownik).withTimeout (30; TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).ignoring (NoSuchElementException.class);

W powyższym przykładzie deklarujemy płynne oczekiwanie z limitem czasu 30 sekund, a częstotliwość jest ustawiona na 5 sekund, ignorując „ NoSuchElementException

Rozważ następujący kod:

zastosowanie publicznego WebElement (sterownik 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 ")); 

Stworzyliśmy nową funkcję do identyfikacji elementu internetowego na stronie. (Np .: tutaj element sieci Web to nic innego jak łącze Selenium na stronie internetowej).

Częstotliwość jest ustawiona na 5 sekund, a maksymalny czas na 30 sekund. Oznacza to, że będzie sprawdzał element na stronie internetowej co 5 sekund przez maksymalny czas 30 sekund. Jeśli element znajduje się w tym przedziale czasowym, wykona operacje, w przeciwnym razie wyrzuci „ ElementNotVisibleException

Różnica między niejawnym oczekiwaniem a jawnym oczekiwaniem

Niejawne oczekiwanie Jawne oczekiwanie
  • Niejawny czas oczekiwania jest stosowany do wszystkich elementów w skrypcie
  • Jawny czas oczekiwania jest stosowany tylko do tych elementów, które są przez nas zamierzone
  • W niejawnego czekaj, musimy nie określenie „ExpectedConditions” na elemencie być zlokalizowany
  • W jawnym oczekiwaniu musimy określić „ExpectedConditions” w elemencie, który ma zostać zlokalizowany
  • Zaleca się użycie, gdy elementy są zlokalizowane w ramach czasowych określonych w niejawnym oczekiwaniu Selenium
  • Zaleca się używać, gdy ładowanie elementów trwa długo, a także do weryfikacji właściwości elementu, takich jak (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected)

Wniosek:

Niejawne, jawne i płynne oczekiwanie to różne rodzaje oczekiwania używane w Selenium. Wykorzystanie tych czekań jest całkowicie oparte na elementach ładowanych w różnych odstępach czasu. Zawsze nie jest zalecane używanie Thread.Sleep () podczas testowania naszej aplikacji lub budowania naszego frameworka.

Ten artykuł jest autorstwa Caitanyi Pujari