1. 强制等待:time.sleep()
  2. 显式等待:WebDriverWait() func
  3. 隐式等待:implicitly_wait()

1. 强制等待

利用 time 模块的 sleep() 方法:time.sleep(3) # 等待3秒
这种叫强制等待,不管你浏览器是否加载完成,都得给我等待3秒,3秒一到,继续执行下面的代码,不建议用这种等待方法,严重影响代码的执行速度。

2. 隐式等待

方法:driver.implicitly_wait(3) # 隐式等待3秒
设置一个等待时间

  • 在等待时间内,页面加载完成,则执行下一步;否则一直等待时间结束,然后执行下一步
  • 缺点:程序会一直等待整个页面加载完成,直到超时,需要的元素加载完成,个别元素加载慢,仍要等待整个页面加载完成才能执行下一步

3. 显式等待

from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
4个参数:

  • driver:浏览器驱动对象
  • timeout:等待时间
  • poll_frequency:检测的间隔时间,默认0.5s
  • ignored_exception:超时后的异常信息,默认抛出 NoSuchElementException

为了避免隐式等待的缺点,需要用到显式等待
配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx检查一次,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException

  1. from selenium import webdriver
  2. from selenium.common.exceptions import TimeoutException
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. driver = webdriver.Chrome()
  7. driver.get("https://www.baidu.com/")
  8. try:
  9. element = WebDriverWait(driver, 10).until(
  10. EC.presence_of_element_located((By.XPATH, '//*[@id="su"]'))
  11. )
  12. text = driver.page_source
  13. print("text", text)
  14. finally:
  15. driver.quit()