selenium自动化操作之五:显示等待
现在的网页越来越多采用了Ajax技术,这样程序便不能确定何时某个元素完全加载出来。如果实际页面等待时间过长导致某个元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出异常。
为了解决这个问题。所以selenium提供了两种等待方式:隐式等待和显示等待。显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再才是查找某元素。
1 固定休眠:time.sleep()。它将条件设置为等待一个确切的时间段。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
time.sleep(10)
element = driver.find_element_by_id('kw')
print(element)
10秒后,才开始找元素
2 隐式等待:driver.implicitly_wait(seconds) 。在获取不可用的元素之前,会先等待10秒的时间,示例代码如下:
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
element = driver.find_element_by_id('123456')
print(element)
10秒后,element没有找到,抛出异常NoSuchElementException
。如果去掉代码driver.implicitly_wait(10)
,则马上抛出异常。
注意:implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
3 显示等待:driver.WebDriverWait() 。显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待selenium.webdriver.support.ui.WebDriverWait
需要结合selenium.webdriver.support.expected_conditions
期望的条件来实现。示例代码如下:
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.Chrome()
driver.get('https://www.baidu.com')
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'kw'))
)
finally:
driver.quit()
在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。 WebDriverWai()调用unit()
方法提供的驱动程序作为一个参数,直到返回值不为 False。
WebDriverWait() 详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Firefox, Chrome)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
expected_conditions 期望的条件:
-
title_is(object)
:检查页面标题是否为预期的标题,必须完全匹配,如果标题匹配,则返回True,否则返回False。 -
title_contains(object)
:检查页面标题是否包含区分大小写的字符串。当标题匹配时返回True,否则返回False。 -
presence_of_element_located(object)
:检查某个元素是否存在于页面,不论元素是否可见。当某个元素存在则返回True,否则返回False。 -
presence_of_all_elements_located(object)
:检查是否至少有一个满足条件的元素存在于页面。存在时返回True,否则返回False。 -
visibility_of_element_located(object)
:检查某个元素是否存在于页面和可见。可见性意味着不仅显示元素但高度和宽度也大于0。当某个元素存在则返回True,否则返回False。 -
visibility_of_all_elements_located(object)
:检查所有满足条件的元素是否存在于页面和可见。可见性意味着不仅显示元素但高度和宽度也大于0。当所有元素都存在时则返回True,否则返回False。 -
url_to_be
:检查当前的url是否是所需的url,必须完全匹配。如果匹配时则返回True,否则返回False。 -
url_contains(object)
:检查当前URL是否包含区分大小写的子字符串。如果匹配时则返回True,否则返回False。 -
url_changes(object)
:检查当前的url是否是所需的url,不能完全匹配。当不能匹配时则返回True,否则返回False。 -
text_to_be_present_in_element(object)
:检查给指定文本是否存在于指定元素。如果存在指定文本则返回True,否则返回False。 -
text_to_be_present_in_element_value(object)
:检查给指定文本是否存在于指定元素的属性值。如果存在指定文本则返回True,否则返回False。