在我们进行网页操作的时候, 有的元素内容不是可以立即出现的, 可能会等待一段时间,这个时候去
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)