一、前言
selenium中有三种时间等待:
- 强制等待:
sleep
- 隐式等待:
implicitly_wait
- 显示等待:
WebDriverWait
其中,这三种方法各有优缺点:
二、强制等待
让程序暂停运行一定的时间,等待时间达到要求的时间后继续运行。
使用前,需要先导入time模块:
import time
在前面的文章中,已经多次使用过,这里就不做演示了。
需要注意的是,对于定位不到元素的时候,从耗时方面来讲,隐式等待
和强制等待
没什么区别。
三、隐式等待
implicitly_wait()
默认参数的单位为秒,默认值为0。
如果在最大超时时间内找到元素了,会开始执行下一操作,未找到元素,则会抛出NoSuchElementException
异常。
以百度为例:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() # 访问百度 driver.get('https://baidu.com') start = time.time() # 设置最大等待时间为3秒 driver.implicitly_wait(3) try: # 使用id定位一个不存在的元素 driver.find_element(By.ID, 'yyds') except Exception as exception: # 打印异常 print(exception) # 打印程序运行时间 print(f'耗时:{time.time()-start}') # 关闭所有页面 driver.quit()
四、显示等待
需要导入模块:
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver: 传入WebDriver实例;
timeout:指最大超时时间,默认单位为秒;
poll_frequency:调用until或until_not方法,每隔一定时间不断尝试是否能找到页面元素,默认间隔是0.5s,可自行调整间隔时间。
ignored_exceptions:超时后的异常信息,默认情况下NoSuchElementException 异常。
WebDriverWait一般和until()和until_not()配合使用:
until() 当某元素出现 或 某条件成立则继续执行
until_not 当某元素消失 或 某条件不成立则继续执
until或until_not中的method参数一定要是可以调用的对象,我们可以用selenium提供的expected_conditions,提供一些场景的判断。
但使用expected_conditions
,需先导入:
from selenium.webdriver.support import expected_conditions as EC
常用的expected_conditions
方法如下:
以百度为例:
- 定位一个存在的元素:
from selenium import webdriver 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') # 设置显式等待,超时时长最大为5s,每隔1s查找元素一次 # 根据id定位到元素位置 element = WebDriverWait(driver, 5, 1).until( EC.presence_of_element_located(('id', 'kw'))) # 在定位到的地方,输入CSDN element.send_keys('CSDN')
- 定位一个不存在的元素
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') # 设置显式等待,超时时长最大为5s,每隔1s查找元素一次 # 根据id定位到元素位置 element = WebDriverWait(driver, 5, 1).until( EC.presence_of_element_located((By.ID, 'csdn')), message='超时了哟。。。')
得到提示:
selenium.common.exceptions.TimeoutException: Message: 超时了哟。。。