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
- Niejawne oczekiwanie
- 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
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- obecnośćOfAllElementsLocatedBy ()
- obecnośćOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visibilityOf ()
- visibilityOfAllElements ()
- visibilityOfAllElementsLocatedBy ()
- 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ę");}Waitwait = 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:
Waitwait = 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 |
---|---|
|
|
|
|
|
|
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