元素操纵篇-Day12|等待显形咒:wait 等待元素加载,解决网页延迟难题

4 次阅读 2026-10-20 14:38

📖 知识点

1. 为什么要等待?

网页元素不是瞬间全部出现。网络慢、动态渲染、加载更多…… 都可能让元素 "迟到"。不等就点,元素是 None,直接报错崩溃。等待咒就是解决这个问题。

2. 等元素出现:wait 等待

DrissionPage 的 .wait.eles() / .wait.ele_displayed() 等待元素出现并可见:

# 等待指定元素出现,最多等5秒,超时抛异常
page.wait.eles(".target", timeout=5)

timeout 单位是秒,表示最多等多久;元素提前出现就立即返回继续执行,不用干等满时间。

3. 等待元素消失 / 固定等待

# 等待某个元素消失(如加载中的转圈提示消失)
page.wait.eles_delete(".loading", timeout=5)

# 固定等待几秒(如等动态数据完全加载)
import time
time.sleep(2)   # 简单粗暴的等2秒

4. 定位 + 等待 防御性写法

等待咒最常用的配合:先 wait,再定位操作

# 等待搜索按钮出现后,再点击
page.wait.eles("#su", timeout=5)
page.ele("#su").click()

这样就不会因为按钮还没加载出来而报错。

💡 总结

场景咒语
等元素出现page.wait.eles(选择器, timeout=秒)
等元素消失page.wait.eles_delete(选择器, timeout=秒)
固定等待time.sleep(秒)

⚠️ 易错提醒

  1. timeout 不写会一直等(或默认很久),建议显式给个合理秒数
  2. 等待超时会抛异常,用 try/except 捕获更稳(后续 Day29)
  3. 尽量用 "等元素出现" 代替盲目的 sleep,更高效稳定

⚔️ Kata 实战任务

任务需求:

  1. 导入 ChromiumPage 和 time
  2. 访问百度
  3. 用 page.wait.eles(".s_ipt", timeout=5) 等待搜索输入框出现
  4. 再用 page.wait.eles("#su", timeout=5) 等待搜索按钮出现
  5. 输入关键词 Python 并点击搜索按钮
  6. 用 time.sleep(2) 固定等待搜索结果加载

参考代码

from DrissionPage import ChromiumPage
import time

page = ChromiumPage()
page.get("https://www.baidu.com")

# 等待显形咒:等输入框出现
page.wait.eles(".s_ipt", timeout=5)
print("✅ 搜索输入框已出现")

# 等搜索按钮出现
page.wait.eles("#su", timeout=5)
print("✅ 搜索按钮已出现")

# 输入关键词并点击搜索
page.ele(".s_ipt").input("Python")
page.ele("#su").click()
print("🔍 已发起搜索")

# 固定等待2秒,让结果页加载
time.sleep(2)
print("⏳ 等待结果加载完成")

运行输出:

✅ 搜索输入框已出现
✅ 搜索按钮已出现
🔍 已发起搜索
⏳ 等待结果加载完成

🧠 思考题

  1. page.wait.eles() 和 time.sleep() 的本质区别是什么?为什么推荐前者?
  2. 如果元素始终不出现,page.wait.eles() 到 timeout 后会怎样?怎么避免程序崩溃?