Python Selenium 元素等待机制详解:显式与隐式等待
本文详细介绍 Python Selenium 中两种核心元素等待机制:显式等待与隐式等待。通过 WebDriverWait 类结合 expected_conditions 实现精准的元素状态检测,以及利用 implicitly_wait 设置全局超时轮询。文章包含完整代码示例与参数解析,帮助开发者解决页面加载不同步导致的定位失败问题,提升爬虫稳定性。
Selenium 显式等待机制
一、显式等待
WebDriverWait 类由 WebDriver 提供,用于实现显式等待功能。在设定的时间范围内,该方法会按照指定的频率周期性检测当前页面中指定元素是否存在。若在规定时间内未检测到目标元素,则抛出 TimeoutException 异常。
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
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
element = WebDriverWait(driver, 5, 0.5).until(
EC.presence_of_element_located((By.ID, "kw"))
)
element.send_keys('selenium')
time.sleep(5)
driver.quit()
语法:
- WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None).until(method, message='')
参数说明如下:
- driver:浏览器驱动实例
- timeout:最大等待时间,单位默认为秒
- poll_frequency:检测间隔时间,默认值为 0.5 秒
- ignored_exceptions:超时后抛出的异常类型,默认情况下抛出 NoSuchElementException 异常
- until(method, message=''):接收一个驱动方法作为参数,直到该方法返回值为 True 时继续执行
- until_not(method, message=''):接收一个驱动方法作为参数,直到该方法返回值为 False 时继续执行
- presence_of_element_located():用于判断指定位置的元素是否存在于 DOM 中。
二、隐式等待
Selenium 隐式等待机制
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time
driver = webdriver.Chrome()
# 设置隐式等待为5秒
driver.implicitly_wait(5)
driver.get("http://www.baidu.com")
try:
print(time.strftime('%Y-%m-%d %H:%M:%S'))
driver.find_element_by_id("123456").send_keys('selenium') #不存在的id,看输出报错和时间
# driver.find_element_by_id("kw").send_keys('selenium') # 存在的id
except NoSuchElementException as e:
print(e)
finally:
print(time.strftime('%Y-%m-%d %H:%M:%S'))
driver.quit()
implicitly_wait() 方法默认值为 0,参数单位为秒。例如设置等待时间为 5 秒,这与直接使用 time.sleep(5) 阻塞线程不同。当执行流程到达某个元素定位指令时,若元素已存在则立即继续执行;若未定位到,则以循环方式不断轮询检查元素是否出现。若在设定的超时时间内(如 1 秒时)定位成功,则直接向下运行;若超出设置时长仍未找到,则抛出异常。
Selenium 文集传送门:
| 标题 | 简介 |
|---|---|
| Python爬虫 - Selenium(1)安装和简单使用 | 详细介绍Selenium的依赖环境在Windows和Centos7上的安装及简单使用 |
| Python爬虫 - Selenium(2)元素定位和WebDriver常用方法 | 详细介绍定位元素的8种方式并配合点击和输入、提交、获取断言信息等方法的使用 |
| Python爬虫 - Selenium(3)控制浏览器的常用方法 | 详细介绍自定义浏览器窗口大小或全屏、控制浏览器后退、前进、刷新浏览器等方法的使用 |
| Python爬虫 - Selenium(4)配置启动项参数 | 详细介绍Selenium启动项参数的配置,其中包括无界面模式、浏览器窗口大小设置、浏览器User-Agent (请求头)等等 |
| Python爬虫 - Selenium(5)鼠标事件 | 详细介绍鼠标右击、双击、拖动、鼠标悬停等方法的使用 |
| Python爬虫 - Selenium(6)键盘事件 | 详细介绍键盘的操作,几乎包含所有常用按键以及组合键 |
| Python爬虫 - Selenium(7)多窗口切换 | 详细介绍Selenium是如何实现在不同的窗口之间自由切换 |
| Python爬虫 - Selenium(8)frame/iframe表单嵌套页面 | 详细介绍如何从当前定位的主体切换为frame/iframe表单的内嵌页面中 |
| Python爬虫 - Selenium(9)警告框(弹窗)处理 | 详细介绍如何定位并处理多类警告弹窗 |
| Python爬虫 - Selenium(10)下拉框处理 | 详细介绍如何灵活的定位并处理下拉框 |
| Python爬虫 - Selenium(11)文件上传 | 详细介绍如何优雅的通过send_keys()指定文件进行上传 |
| Python爬虫 - Selenium(12)获取登录Cookies,并添加Cookies自动登录 | 详细介绍如何获取Cookies和使用Cookies进行自动登录 |
| Python爬虫 - Selenium(13)设置元素等待 | 详细介绍如何优雅的设置元素等待时间,防止程序运行过快而导致元素定位失败 |
| Python爬虫 - Selenium(14)窗口截图 | 详细介绍如何使用窗口截图 |
| Python爬虫 - Selenium(15)关闭浏览器 | 详细介绍两种关闭窗口的区别 |
到此这篇关于 Python 爬虫之 Selenium 设置元素等待的方法的文章就介绍到这了,更多相关 Selenium 元素等待内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









