В Селен "Waits" играе важна роля при изпълнението на тестове. В този урок ще научите различни аспекти както на "неявно", така и на "явно" чакане в Selenium.
В този урок ще научите:
- Защо се нуждаем от чакания в селен?
- Неявно чакане
- Изрично изчакайте
- Плавно изчакайте
Защо се нуждаем от чакания в селен?
Повечето уеб приложения са разработени с помощта на Ajax и Javascript. Когато дадена страница се зарежда от браузъра, елементите, с които искаме да взаимодействаме, могат да се зареждат през различни интервали от време.
Не само затруднява идентифицирането на елемента, но и ако елементът не е локализиран, ще изведе изключение „ ElementNotVisibleException “. Използвайки Selenium Waits, можем да разрешим този проблем.
Нека разгледаме сценарий, при който трябва да използваме както неявни, така и явни изчаквания в нашия тест. Да приемем, че неявното време на изчакване е зададено на 20 секунди, а времето на изричното изчакване е зададено на 10 секунди.
Да предположим, че се опитваме да намерим елемент, който има някои "Очаквани условия " (Изрично изчакване). Ако елементът не се намира в рамките на времевия интервал, определен от Изричното изчакване (10 секунди), той ще използва времевия интервал, дефиниран от неявното изчакване ( 20 секунди) преди да се хвърли " ElementNotVisibleException ".
Изчаква селенов уеб драйвер
- Неявно чакане
- Изрично изчакайте
Неявно чакане в селен
В Скритият чакат в Селен се използва за да каже на уеб шофьора да изчака определен период от време, преди да хвърля "Няма такова Element изключение". Настройката по подразбиране е 0. След като зададем часа, уеб драйверът ще изчака елемента за това време, преди да хвърли изключение.
Селеновият уеб драйвер е заимствал идеята за имплицитни изчаквания от Watir.
В примера по-долу сме декларирали неявно изчакване с времева рамка от 10 секунди. Това означава, че ако елементът не се намира на уеб страницата в рамките на този период от време, той ще изведе изключение.
За да декларирате неявно чакане:
Синтаксис :
driver.manage (). timeouts (). implicitlyWait (TimeOut, TimeUnit.SECONDS);
пакет guru.test99;импортиране на java.util.concurrent.TimeUnit;внос org.openqa.selenium.By;импортиране на org.openqa.selenium.WebDriver;импортиране на org.openqa.selenium.chrome.ChromeDriver;внос org.testng.annotations.Test;публичен клас AppTest {защитен драйвер на WebDriver;@Тестpublic void guru99tutorials () хвърля InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");драйвер = нов ChromeDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);String eTitle = "Демо страница на Guru99";Низ aTitle = "";// стартираме Chrome и го пренасочваме към основния URL адресdriver.get ("http://demo.guru99.com/test/guru99home/");// Максимизира прозореца на браузъраdriver.manage (). window (). maximize ();// получаваме действителната стойност на заглавиетоaTitle = driver.getTitle ();// сравняваме действителното заглавие с очакваното заглавиеако (aTitle.equals (eTitle)){System.out.println ("Тестът премина");}друго {System.out.println ("Тестът е неуспешен");}// затваряне на браузъраdriver.close ();}}
Обяснение на кода
В горния пример,
Помислете за следния код:
driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);
Неявното чакане ще приеме 2 параметъра, първият параметър ще приеме времето като цяло число, а вторият параметър ще приеме измерването на времето по отношение на СЕКУНДИ, МИНУТИ, МИЛИСЕКУНД, МИКРОСЕКОНДИ, НАНОСЕКОНДИ, ДНИ, ЧАСОВЕ и т.н.
Изрично изчакване в селен
В Изрично чакат в Селен се използва за да каже на уеб шофьора да изчака определени условия (очаквани условия) или максимално време за надвишени, преди да хвърлите "ElementNotVisibleException" изключение. Това е интелигентен вид изчакване, но може да се приложи само за определени елементи. Той дава по-добри опции от неявното чакане, тъй като чака динамично заредени елементи на Ajax.
След като декларираме изрично изчакване, трябва да използваме " Очаквани условия " или можем да конфигурираме колко често искаме да проверяваме състоянието с помощта на Fluent Wait . Тези дни, докато внедряваме, използваме Thread.Sleep () като цяло не се препоръчва да се използва
В примера по-долу създаваме референтно изчакване за класа " WebDriverWait " и създаваме екземпляр с помощта на референция " WebDriver " и даваме максимална времева рамка от 20 секунди.
Синтаксис:
WebDriverWait wait = нов WebDriverWait (WebDriverRefrence, TimeOut);
пакет guru.test99;импортиране на java.util.concurrent.TimeUnit;внос org.openqa.selenium.By;импортиране на org.openqa.selenium.WebDriver;внос org.openqa.selenium.WebElement;импортиране на org.openqa.selenium.chrome.ChromeDriver;импортиране на org.openqa.selenium.support.ui.ExpectedConditions;импортиране на org.openqa.selenium.support.ui.WebDriverWait;внос org.testng.annotations.Test;публичен клас AppTest2 {защитен драйвер на WebDriver;@Тестpublic void guru99tutorials () хвърля InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");драйвер = нов ChromeDriver ();WebDriverWait wait = нов WebDriverWait (драйвер, 20);String eTitle = "Демо страница на Guru99";Низ aTitle = "";// стартираме Chrome и го пренасочваме към основния URL адресdriver.get ("http://demo.guru99.com/test/guru99home/");// Максимизира прозореца на браузъраdriver.manage (). window (). maximize ();// получаваме действителната стойност на заглавиетоaTitle = driver.getTitle ();// сравняваме действителното заглавие с очакваното заглавиеif (aTitle.contentEquals (eTitle)){System.out.println ("Тестът премина");}друго {System.out.println ("Тестът е неуспешен");}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 " или " ExpectedConditions ", да настъпи, което от двете настъпи първо.
Горният код на Java гласи, че чакаме елемент за времевата рамка от 20 секунди, както е дефинирано в класа " WebDriverWait " на уеб страницата, докато не бъдат изпълнени " ExpectedConditions " и условието е " visibilityofElementLocated ".
По-долу са очакваните условия, които могат да бъдат използвани в Selenium Explicit Wait
- alertIsPresent ()
- elementSelectionStateToBe ()
- elementToBeClickable ()
- elementToBeSelected ()
- frameToBeAvaliableAndSwitchToIt ()
- invisibilityOfTheElementLocated ()
- invisibilityOfElementWithText ()
- присъствиеOfAllElementsLocatedBy ()
- присъствиеOfElementLocated ()
- textToBePresentInElement ()
- textToBePresentInElementLocated ()
- textToBePresentInElementValue ()
- titleIs ()
- titleContains ()
- visibilityOf ()
- visibilityOfAllElements ()
- visibilityOfAllElementsLocatedBy ()
- visibilityOfElementLocated ()
Плавно изчакайте в селен
В Fluent чакат в Селен се използва за определяне максималното време за уеб шофьора да изчака състояние, както и честотата, с която ние искаме да се провери състоянието преди хвърляне на "ElementNotVisibleException" изключение. Той проверява за уеб елемента на редовни интервали, докато обектът бъде намерен или времето на изчакване не се случи.
Честота: Настройване на цикъл на повторение с времевата рамка за проверка / проверка на състоянието през редовния интервал от време
Нека разгледаме сценарий, при който елемент се зарежда през различни интервали от време. Елементът може да се зареди в рамките на 10 секунди, 20 секунди или дори повече от това, ако декларираме изрично изчакване от 20 секунди. Той ще изчака до определеното време, преди да хвърли изключение. В такива сценарии плавното изчакване е идеалното изчакване за използване, тъй като това ще се опита да намери елемента с различна честота, докато го намери или крайният таймер изтече.
Синтаксис:
Изчакайте изчакайте = ново FluentWait (справка за WebDriver).withTimeout (таймаут, SECONDS).pollingEvery (изчакване, SECONDS).записване (изключение.клас);
Горният код е остарял в Selenium v3.11 и по-нови. Трябва да използвате
Изчакайте изчакайте = ново FluentWait (справка за WebDriver).withTimeout (Duration.ofSeconds (SECONDS)).pollingEvery (Duration.ofSeconds (SECONDS)).записване (изключение.клас);
пакет guru.test99;внос org.testng.annotations.Test;импортиране на java.util.NoSuchElementException;импортиране на java.util.concurrent.TimeUnit;импортиране на java.util.function.Function;внос org.openqa.selenium.By;импортиране на org.openqa.selenium.WebDriver;внос org.openqa.selenium.WebElement;импортиране на org.openqa.selenium.chrome.ChromeDriver;импортиране на org.openqa.selenium.support.ui.ExpectedConditions;внос org.openqa.selenium.support.ui.FluentWait;внос org.openqa.selenium.support.ui.Wait;импортиране на org.openqa.selenium.support.ui.WebDriverWait;внос org.testng.annotations.Test;публичен клас AppTest3 {защитен драйвер на WebDriver;@Тестpublic void guru99tutorials () хвърля InterruptException{System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");String eTitle = "Демо страница на Guru99";Низ aTitle = "";драйвер = нов ChromeDriver ();// стартираме Chrome и го пренасочваме към основния URL адресdriver.get ("http://demo.guru99.com/test/guru99home/");// Максимизира прозореца на браузъраdriver.manage (). window (). maximize ();// получаваме действителната стойност на заглавиетоaTitle = driver.getTitle ();// сравняваме действителното заглавие с очакваното заглавиеif (aTitle.contentEquals (eTitle)){System.out.println ("Тестът премина");}друго {System.out.println ("Тестът е неуспешен");}Изчакайтеизчакайте = нов FluentWait (драйвер).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).вписване (NoSuchElementException.class);WebElement clickseleniumlink = wait.until (нова функция () {публичен WebElement се прилага (драйвер за WebDriver) {връщане на 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 "));}});// щракнете върху връзката селенclickseleniumlink.click ();// затваряне ~ браузърdriver.close ();}}
Обяснение на кода
Помислете за следния код:
Изчакайтеизчакайте = нов FluentWait (драйвер).withTimeout (30, TimeUnit.SECONDS).pollingEvery (5, TimeUnit.SECONDS).вписване (NoSuchElementException.class);
В горния пример декларираме плавно изчакване с изчакване от 30 секунди и честотата е настроена на 5 секунди, като се игнорира „ NoSuchElementException “
Помислете за следния код:
публичен WebElement се прилага (драйвер за WebDriver) {връщане на 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 не е нищо друго освен връзката Selenium на уеб страницата).
Честотата е настроена на 5 секунди, а максималното време е 30 секунди. По този начин това означава, че ще проверява за елемента на уеб страницата на всеки 5 секунди за максимално време от 30 секунди. Ако елементът се намира в рамките на този период от време, той ще извърши операциите, в противен случай ще изведе " ElementNotVisibleException "
Разлика между неявно чакане срещу изрично чакане
Неявно чакане | Изрично изчакайте |
---|---|
|
|
|
|
|
|
Заключение:
Имплицитно, явно и плавно чакане са различните чакания, използвани в Selenium. Използването на тези изчаквания се основава изцяло на елементите, които се зареждат през различни интервали от време. Винаги не се препоръчва да използвате Thread.Sleep (), докато тествате нашето приложение или изграждаме нашата рамка.
Тази статия е предоставена от Чайтаня Пуджари