Selenium webdriver python webdriverwait

How to Use Selenium WebDriver Waits using Python

This tutorial will guide you through the concept of Selenium Webdriver waits (Implicit and Explicit Waits) and how to use them in Python.

If you are doing automation in Selenium Python and wish to write error-free scripts, then you must learn to use waits. They let you handle any unexpected condition which may occur.

While automating a web application, you intend to write a script which can execute the following tasks.

Click here to Go Back to main Selenium Python tutorial.

  • Load up the browser,
  • Open up the website,

However, the test script could sometimes fail due to the following reasons.

In these cases, we need to wait for the time to allow the web elements to load completely, before using them in our tests. Webdriver API provides two types of wait mechanisms to handle such conditions. We will discuss these wait conditions one by one in detail.

Selenium Webdriver Waits in Python

Selenium WebDriver Waits in Python Explained with Examples

The two types of Selenium Webdriver waits are :

An implicit wait directs the WebDriver to poll the DOM for a certain amount of time (as mentioned in the command) when trying to locate an element that is not visible immediately. The default value of time that can be set using Implicit wait is zero. Its unit is in seconds. Implicit wait remains associated with the web element until it gets destroyed.

Follow the below coding snippet illustrating the use of Implicit wait in Python.

from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.implicitly_wait(100) driver.get("http://google.com") driver.maximize_window() print("Implicit Wait Example") inputElement = driver.find_element_by_id("lst-ib") inputElement.send_keys("Techbeamers") inputElement.submit() driver.close()

In the above code, the implicitly_wait( ) method tells the Webdriver to poll the DOM again and again for a certain amount of time. The timeout in this example is 100 seconds which will trigger if the target element is not available during that period.

Explicit Wait

There may be scenarios when the wait time is uncertain. Explicit waits work as a savior there. Here we can define certain conditions, and Selenium WebDriver will proceed with the execution of the next step only after this condition gets fulfilled.

The explicit wait is the most preferred way of implementing Selenium webdriver waits in a test script. It provides the flexibility to wait for a custom condition to happen and then move to the next step.

  • WebDriverWait, and
  • Expected Conditions class of the Python.

To understand its usage, let’s take an example of a Simple JavaScript alert on a webpage. A button is present on the web page to trigger that alert.

 

Simple Alert Demonstration

Press button underneath to generate an alert.

function alertFunction()

You need to save this file on your computer and name it as the ‘Simple_Alert.HTML.’

Following is the code snippet demonstrating the Explicit wait.

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as cond from selenium.common.exceptions import NoAlertPresentException from selenium.common.exceptions import TimeoutException driver = webdriver.Firefox() driver.maximize_window() #location = "file://" location = "file://C:/Users/Automation-Dev/Desktop/Meenakshi/Selenium%20Python/Simple_Alert.HTML" driver.get(location) #Press the "Alert" button to demonstrate the Simple Alert button = driver.find_element_by_name('alert') button.click() try: # Wait as long as required, or maximum of 10 sec for alert to appear WebDriverWait(driver,10).until(cond.alert_is_present()) #Change over the control to the Alert window obj = driver.switch_to.alert #Retrieve the message on the Alert window msg=obj.text print ("Alert shows following message: "+ msg ) #Use the accept() method to accept the alert obj.accept() except (NoAlertPresentException, TimeoutException) as py_ex: print("Alert not present") print (py_ex) print (py_ex.args) finally: driver.quit()

In the above script, the timeout value is 10 seconds. It means the Webdriver will wait for 10 seconds before throwing a TimeoutException.
If the element is present, then it may return within the 0 – 10 seconds. By default, the WebDriverWait API executes the ExpectedCondition every 500 milliseconds until it returns successfully.

If the ExpectedCondition matches, then the return value will be a Boolean (TRUE) whereas a non-null value for all other ExpectedCondition types.

Standard Expected Conditions

There are a no. of standard conditions which you may commonly encounter while automating the web pages. Below is the list displaying the names of each of them. All of these classes are available in the “selenium.webdriver.support.expected_conditions” Python module.

    class alert_is_present
    It allows waiting for an alert to appear.

In Selenium Python binding, you can easily find methods to handle these. It saves you from writing any user-defined expected condition class or creating a package for the same.

Quick Wrapup – Selenium Webdriver Waits in Python

Understanding of Selenium Webdriver waits is a key to produce high-quality automation test scripts. We hope this tutorial would have directed you to the right approach.

For more updates on Selenium Python tutorials, do follow our social media (Facebook/Twitter) accounts.

TechBeamers

Источник

Selenium для Python. Глава 5. Ожидания

Продолжение перевода неофициальной документации Selenium для Python.
Оригинал можно найти здесь.

5. Ожидания

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

Selenium WebDriver предоставляет два типа ожиданий — неявное (implicit) и явное (explicit). Явное ожидание заставляет WebDriver ожидать возникновение определенного условия до произведения действий. Неявное ожидание заставляет WebDriver опрашивать DOM определенное количество времени, когда пытается найти элемент.

5.1 Явные ожидания

Явное ожидание — это код, которым вы определяете какое необходимое условие должно произойти для того, чтобы дальнейший код исполнился. Худший пример такого кода — это использование команды time.sleep(), которая устанавливает точное время ожидания. Существуют более удобные методы, которые помогут написать вам код, ожидающий ровно столько, сколько необходимо. WebDriverWait в комбинации с ExpectedCondition является одним из таких способов.

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit() 

Этот код будет ждать 10 секунд до того, как отдаст исключение TimeoutException или если найдет элемент за эти 10 секунд, то вернет его. WebDriverWait по умолчанию вызывает ExpectedCondition каждые 500 миллисекунд до тех пор, пока не получит успешный return. Успешный return для ExpectedCondition имеет тип Boolean и возвращает значение true, либо возвращает not null для всех других ExpectedCondition типов.

Ожидаемые условия
Существуют некие условия, которые часто встречаются при автоматизации веб-сайтов. Ниже перечислены реализации каждого. Связки в Selenium Python предоставляют некоторые удобные методы, так что вам не придется писать класс expected_condition самостоятельно или же создавать собственный пакет утилит.

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable — it is Displayed and Enabled.
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present
from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID,'someid'))) 

Модуль expected_conditions уже содержит набор предопределенных условий для работы с WebDriverWait.

5.2 Неявные ожидания

Неявное ожидание указывает WebDriver’у опрашивать DOM определенное количество времени, когда пытается найти элемент или элементы, которые недоступны в тот момент. Значение по умолчанию равно 0. После установки, неявное ожидание устанавливается для жизни экземпляра WebDriver объекта.

from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement") 

Перейти к следующей главе: Объекты Страницы

P.S.: Пользователь penguino по какой-то причине перестал делать дальнейшие переводы документации, поэтому я решил взять на себя смелость сделать перевод следующей главы.

Источник

Читайте также:  Windows explorer and java
Оцените статью