Selenium Webdriver provides two types of waits - implicit & explicit.
An explicit wait makes WebDriver wait for a certain condition to occur before proceeding further with execution.
An implicit wait makes WebDriver poll the DOM for a certain amount of time when trying to locate an element.css
TimeoutException Example:web
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()
This waits up to 10 seconds before throwing a TimeoutException unless it finds the element to return within 10 seconds.
WebDriverWait by default calls the ExpectedCondition every 500 milliseconds until it returns successfully.
A successful return is for ExpectedCondition type is Boolean return true or not null return value for all other ExpectedCondition types.less
Expected Conditions:dom
alert_is_presentide
from selenium.webdriver.support import expected_conditions as ECui
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))url
Custom Wait Conditions
create custom wait conditions when none of the previous convenience methods fit your requirements.
A custom wait condition can be created using a class with** call method** which returns False when the condition doesn’t match.code
class element_has_css_class(object): """An expectation for checking that an element has a particular css class. locator - used to find the element returns the WebElement once it has the particular css class """ def __init__(self, locator, css_class): self.locator = locator self.css_class = css_class def __call__(self, driver): element = driver.find_element(*self.locator) # Finding the referenced element if self.css_class in element.get_attribute("class"): return element else: return False # Wait until an element with id='myNewInput' has class 'myCSSClass' wait = WebDriverWait(driver, 10) element = wait.until(element_has_css_class((By.ID, 'myNewInput'), "myCSSClass"))
An implicit wait tells WebDriver to poll the DOM for a certain amount of time when trying to find any element (or elements) not immediately available.
The default setting is 0. Once set, the implicit wait is set for the life of the WebDriver object.ci
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")