Содержание:
- Тайм-ауты
- Threads.sleep()
- Явное ожидание (Explicit Wait)
- Неявное ожидание (Implicit Wait)
- Fluent Wait
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Ожидания загрузки страницы в 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)».
Пингбэк: Команды ожидания в Selenium
Пингбэк: Основы автоматизации с помощью Selenium и Python