Selenium 等待

104 阅读1分钟

在我们进行网页操作的时候, 有的元素内容不是可以立即出现的, 可能会等待一段时间,这个时候去 find_element 很可能抛异常 NoSuchElementException, 因此等待是需要的

等待方式1: 强制 sleep

# 等待 1 秒 
from time import sleep sleep(3) 
...
element = wd.find_element(By.ID,'element_id')

但是这样的方法有个很大的问题,就是每当有需要等待的场景都要sleep一下,而且:设置等待多长时间合适呢?
这次百度网站反应可能比较快,我们等了一秒钟就可以了。

等待方式2: 全局等待(隐式等待)

Selenium提供了一个更合理的解决方案,是这样的:
当发现元素没有找到的时候, 并不立即返回 找不到元素的错误。
而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)。

只需要让 web_driver 在调用 find_element 前声明一下即可:

web_driver.implicitly_wait(10)
...
web_driver.find_element(By.ID, 'element_id')

等待方式3: 显式等待

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

...
wait = WebDriverWait(driver=self.web_driver, timeout=10) # wait 对象,等待超时时间为10秒
search_input = wait.until(EC.presence_of_element_located((By.XPATH, '...'))) # 等待元素出现再继续下面的代码
search_input.send_keys(name)