首页 / DrissionPage 入门教程 / 行为模式

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,不抛异常
  • 可以设置全局抛异常或默认返回值
  • 链式写法简洁,但要注意中间环节可能找不到