Ожидания в Selenium для автоматизации тестирования

Ожидания в Selenium

Содержание:

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

Ожидания загрузки страницы в Selenium играют важную роль в ваших Selenium-скриптах. Они помогают сделать их более стабильными и надежными. Selenium предоставляет несколько вариантов, чтобы обеспечить адекватное ожидание или паузу в выполнении сценария в зависимости от определенных условий. В итоге при выполнении автоматизированного тестирования это позволяет избежать негативного результата при запуске сценариев.

Правильные методы ожидания всегда реализуются в WebdriverWait или ExpectedConditions

Тайм-ауты (решение проблем с синхронизацией)

В Selenium исключение TimeoutException возникает при завершении операции после истечения заданного периода времени. Например, при использовании метода WebDriver.get для загрузки страницы тайм-аут по умолчанию установлен на 30 секунд. Если загрузка страницы занимает более 30 секунд, то будет вызвано исключение TimeoutException.

Тайм-ауты Selenium по умолчанию:

Неявное ожидание (Implicit Wait)

  • 0 секунд для неявных ожиданий. Здесь Selenium Command немедленно сообщает о том, что не может найти элемент.

Загрузка страницы

  • 300 секунд на загрузку страницы.

Загрузка сценария

  • 30 секунд для тайм-аутов сценариев.

Как Selenium обрабатывает тайм-аут соединения?

В Selenium тайм-аут соединения можно обработать, задав значение тайм-аута для WebDriver с помощью set_page_load_timeout() метода. Этот метод устанавливает максимальное время (в секундах), в течение которого драйвер должен ожидать загрузки страницы, прежде чем вызвать TimeoutException. Например, чтобы установить тайм-аут равный 10 секундам, можно использовать set_page_load_timeout(10).

Как долго длится тайм-аут Selenium?

Тайм-аут в Selenium задается в секундах или миллисекундах, в зависимости от используемого метода. Например, метод set_page_load_timeout() в WebDriver принимает значение в секундах, а команда pause в Selenium IDE – в миллисекундах.

Изменить тайм-аут по умолчанию в Selenium можно с помощью метода set_page_load_timeout объекта WebDriver. Например:

driver.set_page_load_timeout(10)

Также можно задать таймаут для неявного ожидания присутствия элемента на странице, используя метод  implicitly_wait.

Если сессия длится более 7200 секунд (2 часа), то она прекращается, изменяя статус на TIMEOUT в дашборде (dashboard).

Thread.sleep()

Sleep – это статический метод, принадлежащий классу thread. Этот метод можно вызвать, используя ссылку на имя класса, т.е. Thread. Если использовать Thread.sleep при выполнении автоматизированного тестирования с помощью Selenium, то этот метод остановит выполнение сценария на указанный промежуток времени, независимо от того, найден или нет элемент на веб-странице. Длительность времени принимается в миллисекундах. Синтаксис метода следующий:

Thread.sleep(3000);

Функция sleep вызывает исключение InterruptedException, поэтому её следует обрабатывать с помощью блока try-catch, как показано ниже:

try{

Thread.sleep(5000);

}

catch(InterruptedException ie){

}

Используется, когда необходимо:

  • Обнаружить проблемы с синхронизацией
  • Отсчитать некоторое время независимо от состояния приложения или тестового потока
  • Приостановить все java-процессы для перехода в режим отладки.

Явное ожидание (Explicit Wait)

Явное ожидание – это еще один из видов динамического ожидания Selenium. Оно позволяет остановить выполнение скрипта по определенному условию на заданный промежуток времени. Как только время будет превышено, вы получите ElementNotVisibleException. В сценарии, когда вы не знаете, сколько времени нужно ждать, такое явное ожидание оказывается как нельзя кстати. Используя такие условия, как elementToBeClickable() или textToBePresentInElement(), можно запрограммировать ожидание на заданное время. Использовать эти предопределенные методы можно с помощью комбинации классов WebDriverWait и ExpectedConditions. Для того чтобы их использовать, нужно импортировать в класс следующие пакеты:

import org.openqa.selenium.support.ui.ExpectedConditions
import org.openqa.selenium.support.ui.WebDriverWait

Для этого необходимо создать ссылку на переменную для класса WebDriverWait и инстанцировать её, используя экземпляр WebDriver, а также задать необходимое количество времени ожидания для загрузки страницы. Единицей измерения времени являются секунды. В итоге получается следующее выражение:

WebDriverWait wait = new WebDriverWait(driver,30);

Для того чтобы использовать предопределенные методы класса ExpectedCondition, мы будем использовать ссылку на переменную wait, как показано ниже:

wait.until(ExpectedConditions.visibilityOfElementLocated(Reference of Element to be located using locator));**Types of Expected Conditions:**

Типы Expected Conditions:

Ниже приведены несколько типов Expected Conditions (условия ожидания), часто используемых при выполнении автоматизированного тестирования с помощью Selenium:

  • visibilityOfElementLocated()– проверяет наличие или отсутствие конкретного элемента
  • alertIsPresent()– проверяет наличие или отсутствие предупреждения
  • elementToBeClickable()– проверяет, присутствует ли данный элемент на экране/можно ли на него нажать
  • textToBePresentInElement()– проверяет наличие или отсутствие в конкретном элементе требуемого текста
  • titlels()– проверяет условия ожидания страницы, имеющей определенный заголовок

Существует множество других условий ожидания, с которыми можно ознакомиться на официальной странице GitHub компании Selenium. Как и неявное ожидание, явное ожидание также проводит проверки через каждые 500 миллисекунд.

Ниже приведен фрагмент кода, демонстрирующий использование явного ожидания в Selenium:

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

 
public class ExplicitWait {
    public static void main(String[] args) {

                System.setProperty("webdriver.chrome.driver", ".\\Driver\\chromedriver.exe");
                WebDriver driver=new ChromeDriver();
                driver.manage().window().maximize();
                driver.get("https://www.rentomojo.com/");
                driver.findElement(By.xpath("//span[@class='rm-city__selectorBoxLoca'][contains(text(),'Delhi')]")).click();
                WebDriverWait wait=new WebDriverWait(driver, 120);
                wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//div[@class='Campaign__innerWrapper']/button"))));
                driver.findElement(By.xpath("//div[@class='Campaign__innerWrapper']/button")).click();
    }
}

Замечание: когда явное и неявное ожидания задаются совместно, они работают на суммарное количество времени, а не на какое-то одно условие ожидания.

Неявное ожидание (Implicit Wait)

Компания Selenium преодолела проблемы, связанные с Thread.sleep() и предложила два варианта ожидания при загрузке страницы. Одно из них – неявное ожидание – позволяет приостановить работу WebDriver на определенный период времени, пока WebDriver не найдет нужный элемент на веб-странице.

Ключевым моментом здесь является то, что в отличие от Thread.sleep(), он не ждет на протяжении всего заданного времени. Если он находит элемент до истечения указанного периода, то сразу переходит к выполнению следующей строки кода, тем самым сокращая время выполнения сценария. Поэтому неявное ожидание также называют динамическим ожиданием. Если за указанное время элемент не найден, то отрабатывает исключение ElementNotVisibleException.

Еще один интересный момент, связанный с неявным ожиданием, заключается в том, что оно применяется глобально, что делает его более оптимальным вариантом по сравнению с Thread.sleep(). Это означает, что достаточно прописать метод один раз, и он будет применяться ко всем веб-элементам, указанным в скрипте, во всем экземпляре WebDriver. Удобно, не правда ли? Синтаксис для достижения этой цели следующий:

driver.manage().timeouts().implicitlyWait(Time Interval to wait for, TimeUnit.SECONDS);

По умолчанию время неявного ожидания равно нулю, а поиск нужного элемента продолжается через каждые 500 миллисекунд. Рассмотрим приведенный ниже фрагмент кода, демонстрирующий использование неявного ожидания:

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;  
import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor;
 
public class ImplicitWait {
    public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.chrome.driver", ".\\Driver\\chromedriver.exe");
        WebDriver driver=new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

        driver.get("https://www.easemytrip.com/");
        driver.findElement(By.id("FromSector_show")).sendKeys("Delhi", Keys.ENTER);
        driver.findElement(By.id("Editbox13_show")).sendKeys("Mumbai", Keys.ENTER);
        driver.findElement(By.id("ddate")).click();
        driver.findElement(By.id("snd_4_08/08/2019")).click();
        driver.findElement(By.className("src_btn")).click();
        driver.findElement(By.xpath("//button[text()='Book Now']")).click();

        JavascriptExecutor jse = (JavascriptExecutor)driver;

        jse.executeScript("window.scrollBy(0,750)");
        driver.findElement(By.xpath("//input[@type='email']")).sendKeys("sadhvisingh9049@gmail.com");
        driver.findElement(By.xpath("//span[text()='Continue Booking']")).click(); 
        WebElement title=driver.findElement(By.id("titleAdult0"));
        Select titleTraveller=new Select(title);
        titleTraveller.selectByVisibleText("MS");

        driver.findElement(By.xpath("//input[@placeholder='Enter First Name']")).sendKeys("Sadhvi");
        driver.findElement(By.xpath("//input[@placeholder='Enter Last Name']")).sendKeys("Singh");
        driver.findElement(By.xpath("//input[@placeholder='Mobile Number']")).sendKeys("9958468819");
        driver.findElement(By.xpath("//div[@class='con1']/span[@class='co1']")).click();

    }

}

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

Теперь, поскольку вы знаете об использовании явного и неявного ожидания, давайте рассмотрим разницу между этими двумя типами .

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

  • По умолчанию применяется ко всем элементам скрипта
  • Нет возможности задать одно конкретное условие ожидания
  • Обычно используется, когда вы уверены, что элемент станет видимым через определенное время

Явное ожидание:

  • Применимо только к определенному элементу, специфичному для конкретного условия
  • Можно задать ожидание на основе конкретного условия
  • Обычно используется, когда не известно время появления элемента

Свободное ожидание (Fluent Wait)

Fluent wait по своему функционированию похоже на явное ожидание. Свободное ожидание применяется в том случае, когда вам не известно время, через которое элемент станет видимым или кликабельным. К числу факторов, характерных для свободного ожидания, относятся:

  • Частота проверки. В случае явного ожидания эта частота проверки по умолчанию составляет 500 миллисекунд. Используя свободное ожидание, вы можете изменять частоту проверки в зависимости от ваших потребностей, т.е. вы можете указать в своем скрипте, чтобы он продолжал проверять элемент через каждые ‘x’ секунд.
  • Игнорирование исключений. При проверке, в случае если элемент не найден, можно проигнорировать любое исключение типа NoSuchElement и т.п.

Приведенный ниже синтаксис используется для определения свободного ожидания в Selenium:

Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver)

       .withTimeout(60, SECONDS)

       .pollingEvery(2, SECONDS)

       .ignoring(NoSuchElementException.class);

      WebElement foo = fluentWait.until(new Function<WebDriver, WebElement>() {

     public WebElement apply(WebDriver driver)  

     {  return driver.findElement(By.id("foo"));

}});

Основное различие между явным и свободным ожиданиями заключается в том, что явное ожидание предоставляет предопределенные условия, которые применяются к элементам, требующим ожидания, тогда как в случае свободного ожидания вы можете определить свои собственные условия в методе apply.

Перевод статьи «Selenium Waits for Test Automation (Timeouts, Threads.sleep, Explicit Wait, Implicit Wait & Fluent Wait)».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *