强制等待
# 参数为等待的时间,单位为秒
time.sleep(1)
强制等待是不需要借助selenium中的函数实现的,其实就在之前一篇的示例中演示的,通过time.sleep()函数实现程序的wait操作。这个等待是python基础库中就有的函数。
- 缺点: 过于死板,而且耗费时间过多
- 优点: 编写简单,强制性的等待可能有其他用途
隐式等待
# 参数为等待的最大时间,单位为秒
driver.implicitly_wait(10)
对获取的浏览器驱动进行配置,配置其等待的最大时间
- 缺点: 必须等待页面全部加载完成,才能进行下一步操作,如果需要对页面特定的元素进行操作,元素已经加载完成,但是页面未加载完成,那么必须等待页面加载完,才能进行后续的操作,造成时间上的浪费,所以隐式等待不能精确对某一个元素进行等待
- 优点: 使用方便,能对整个webdriver产生作用,所以只需要设置一次,一般用于整体的等待的配置
显示等待
# 第一个表示选择的窗口,第二个参数表示等待的最大时长,第三个参数表示每隔多少秒在页面中检查元素
# until方法表示需要查找元素的表达式,还有until_not方法,含义则和until相反
WebDriverWait(driver, 10, 0.5).until(lambda el: driver.find_element_by_xpath('//*[@id="1"]/h3/a'))
设置一个等待的条件
WebDriverWait有传了三个参数,其中第一个表示选择的窗口,第二个参数表示等待的最大时长,第三个参数表示每隔多少秒在页面中检查元素。后面的until方法表示需要查找元素的表达式,还有until_not方法,含义则和until相反。如果在指定时间内没有找到指定元素则会抛出一个异常。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
def main():
# 定义一个浏览器驱动
driver = webdriver.Chrome()
# 通过get的方式实现浏览器的调用
driver.get("https://www.baidu.com/")
# 再搜索框中输入关键字
driver.find_element_by_name('wd').send_keys('光粒')
# 通过id属性查找搜索按钮并点击
driver.find_element_by_id('su').click()
# 显示等待,只有找到xpath下的a标签时才会继续执行
WebDriverWait(driver, 10, 0.5).until(lambda el: driver.find_element_by_xpath('//*[@id="1"]/h3/a'))
# 点击第一条搜索结果
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()
time.sleep(5)
driver.quit()
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
main()
- 缺点: 应用上比其他两种方式更加复杂,一次性等待
- 优点: 最大化节约测试时间,精确对指定元素进行等待,使用更加灵活,一般和隐式等待一起使用