隐式等待
-
隐形等待
设置一个超时时间,再这个时间内,不断的寻找元素(每隔0.5s找一次)
若超时仍未找到则抛出timeout 异常,若在时间内找到了,则继续向下执行代码 -
优点
使用简单,一次添加,终身有效。
一般在创建driver之后设置
作用域: 添加隐式等待之后的元素查找 -
缺点
无法指定元素进行等待
需要等页面全部加载完成,相对而言浪费时间
from selenium import webdriver
driver = webdriver.Chrome()
#隐性等待
driver.implicitly_wait(10)
显示等待
-
显示等待
设置一个超时时间和等待元素,这个时间内不断寻找元素,若元素出现,就进行下一步操作
若超时仍未找到则抛出timeout 异常,若在时间内找到了,则继续向下执行代码
条件:1-presence_of_element_located 元素存在
2- visibility_of_element_located 元素可见—最多的
3- element_to_be_clickable 元素可点击 -
优点
不需要等待页面全部加载完成,相对节省时间
可以指定需要等待的元素,对于某些加载特别缓慢的元素,可以为其增加时间
-
缺点
使用相对复杂,代码多
每次等待都需要再写一遍代码
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as ec # 提供等待条件
from selenium.webdriver.support.ui import WebDriverWait #提供等待类的
from selenium.webdriver.common.by import By #提供元素寻找方法的
ele=WebDriverWait(driver,10,0.5).until(
ec.visibility_of_element_located(
(By.CSS_SELECTOR,'*****')
)
)
ele.click()
# 可以将显性等待封装成函数
def webElementWait(driver, timeout,lo_time,by_locate,locate):
'''
:param driver: 浏览器驱动对象
:param timeout: 最大等待时间
:param lo_time: 轮询时间
:param by_locate: 元素定位方法
:param locate: 元素定位表达式
:return: 元素对象
'''
return WebDriverWait(driver,timeout,lo_time).until(
ec.visibility_of_element_located(
(by_locate,locate)
)
)
ele=webElementWait(driver,10,0.5,By.CSS_SELECTOR,'***')
ele.click()
注意:当隐式等待和显示等待都存在的时候
例:隐式等待 5s,显示等待7s, 最长等待时间为7s
强制等待
强制等待:不够灵活,若元素在等待时间内加载完成了,它还是会等待到超过等待时间,才能进行下一步操作。
import time
time.sleep(10)