DrissionPage 入门教程
行为模式
本教程共 42 篇 · 第 19 篇 · 更新于 2026-07-29 · 约 5 分钟阅读
DrissionPageDrissionPage 入门教程行为模式等待策略超时设置
19. 行为模式
本节目标:理解 DrissionPage 查找元素时的等待行为和超时机制,学会设置超时时间,掌握找不到元素时的处理策略。
内置等待机制
网页加载需要时间。你打开一个页面,元素不会立刻全部出现。
DrissionPage 的查找操作都自带等待功能。默认等待 10 秒,期间会不断重试,直到元素出现或超时。
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('https://www.baidu.com')
# 这行代码会等待元素出现,最多等 10 秒
ele = tab.ele('#kw')
如果元素在 3 秒后就出现了,不会傻等 10 秒,直接返回。
如果 10 秒后还没出现,返回 NoneElement。
设置超时时间
全局超时
用 set.timeouts() 设置页面的默认超时时间。
# 设置全局超时为 5 秒
tab.set.timeouts(5)
# 之后所有查找操作都用 5 秒超时
ele = tab.ele('#kw')
单次超时
也可以为某次查找单独设置超时,不影响全局。
# 全局是 5 秒,这次单独用 1 秒
ele = tab.ele('#kw', timeout=1)
# 这次用 30 秒
ele = tab.ele('#slow-element', timeout=30)
单独设置的超时只对这次查找有效,不会改变页面原来的设置。
元素查找也继承超时
在元素内部查找子元素时,默认使用页面的超时设置。
# 页面超时 5 秒
tab.set.timeouts(5)
# 查找页面元素,用 5 秒
ele1 = tab.ele('search text')
# 查找子元素,也用 5 秒
ele2 = ele1.ele('search text')
# 子元素单独设置 1 秒
ele2 = ele1.ele('some text', timeout=1)
找不到元素时
默认行为
默认情况下,找不到元素不会抛异常,而是返回 NoneElement。
ele = tab.ele('#not-exist')
# NoneElement 在 if 判断中表现为 False
if ele:
print('找到了')
else:
print('没找到')
你也可以用 try 捕获异常:
try:
ele.click()
except ElementNotFoundError:
print('没找到')
立即抛出异常
如果你希望找不到时立刻抛异常,可以全局设置:
from DrissionPage.common import Settings
Settings.set_raise_when_ele_not_found(True)
设置后,找不到元素会直接抛出 ElementNotFoundError,不用手动判断。
设置默认返回值
还有一种方式:设置查找失败时返回的值。
# 设置失败时返回 '没找到'
tab.set.NoneElement_value('没找到')
for li in tab.eles('t:li'):
name = li('.name').text
age = li('.age').text
# 如果 .name 不存在,name 会是 '没找到',不会抛异常
这种方式在采集数据时很实用。遍历列表时,某些元素可能缺少子元素,设置默认值可以避免频繁的异常处理。
链式写法
因为元素对象也能查找子元素,所以可以链式调用。
# 多级链式查找
ele = tab.ele('#form').ele('#fieldset').ele('text:提交')
简化写法:
# 用函数调用语法
ele = tab('#form')('#fieldset')('text:提交')
链式写法代码更简洁,但也要注意:中间某个环节找不到,后面就会出错。
主动等待
除了查找时内置的等待,DrissionPage 还提供了主动等待方法。
# 等待指定元素加载到 DOM
tab.wait.eles_loaded('#content')
主动等待在需要确保元素已加载但不需要立即操作时很有用。
大部分情况下,内置等待就够用了。只有特殊场景才需要主动等待。
实际例子
一个典型的登录流程:
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.set.timeouts(10) # 设置 10 秒超时
tab.get('https://example.com/login')
# 等待用户名输入框出现,然后输入
tab.ele('#username').input('myuser')
# 等待密码输入框出现,然后输入
tab.ele('#password').input('mypass')
# 点击登录按钮
tab.ele('text:登录').click()
# 等待跳转完成
tab.wait.ele_displayed('#welcome')
小结
- 所有查找操作自带等待,默认 10 秒
set.timeouts()设置全局超时timeout参数为单次查找设置超时- 找不到元素默认返回
NoneElement,不抛异常 - 可以设置全局抛异常或默认返回值
- 链式写法简洁,但要注意中间环节可能找不到