1. 强制等待 (time.sleep()
)
当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出异常。
最糟糕的案例是使用time.sleep()
,它是一种最简单粗暴的方法,将条件设置为等待一个确切的时间段。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3) # 强制等待3秒
driver.quit()
缺点:不管页面是否加载完成,都要等待固定的时间,严重影响代码的执行速度。
2. 隐式等待 (implicitly_wait()
)
Selenium Webdriver 提供两种类型的等待 - 隐式和显式。
隐式等待是通过设置一个等待时长,在规定时间内网页加载完成后执行下一步,或者等到时间截止后执行下一步,如果此时元素还没有加载出来则抛 NoSuchElement 异常。默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver实例的生命周期,因此只要设置一次即可。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待10秒
driver.get("http://www.baidu.com")
driver.quit()
缺点:程序会一直等待整个页面加载完成,直到超时。有时需要的那个元素早就加载完成了,只是页面上有个别元素加载的比较慢。
3. 显式等待 (WebDriverWait
)
显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。让你只等待需要的时间,在设置时间内,每隔一段时间检测一次条件是否成立(默认每500毫秒调用一次ExpectedCondition直到结果成功返回),如果超过最长设置时间,条件还不成立则抛出 TimeoutException 异常。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 显式等待,每隔0.5秒检测一次元素是否存在,直到超过10秒
element = WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(By.ID, "kw"))
element.send_keys("hwijew")
driver.quit()
WebDriverWait 详情请看 Selenium系列教程 - WebDriverWait 详解以及自定义判断条件