DrissionPage自动化框架
6 min
DrissionPage py自动化框架
使用时遇到的问题记录
记录控制浏览器时遇到的难点
富文本(UEditor)提交为空
- 问题所在:粘贴 (
Ctrl+V) 后,内容仅在视觉层,未同步到底层表单。直接提交会导致后端接收为空。- 解决方法
- 手动触发失焦 (Blur):粘贴后,先点击页面空白处或标题框,强迫编辑器同步数据:
找不到元素(最常见的坑)
问题所在:目标元素在
iframe里,直接用page.ele找不到。解决方案:
先定位 iframe 再查找:
iframe = page.ele('xpath://iframe...') btn = iframe.ele('...')之后又遇到的问题:点击提交后无反应
- 问题所在:按钮被富文本编辑器的工具栏遮挡
- 解决方案:
- 定位到该元素之后:
btn1 = page.ele('xpath:(//button[@class="submit"])[1]')- 使用
js:btn.run_js('this.click()')无痕模式下,访问
http网站出现不安全报错
- 问题是:“忽略”按钮无法被定位到
- 解决方案:
- 目前了解的是,无法解决,因为这个风险提示页面是一个浏览器特殊的页面(待定,如果未来发现解决方案再补充)
Edge 启动弹窗 (同步/导入数据)
问题所在:Edge 首次运行检测到新环境,弹出引导页。
解决方案:
禁用首次运行参数:
co.set_argument('--no-first-run') co.set_argument('--disable-sync')
DrissionPage 基本语法
AI 整理
1. 启动与配置 (Options)
这是脚本的入口,决定了浏览器怎么开。
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_argument('--start-maximized') # 窗口最大化
co.set_argument('--ignore-certificate-errors') # 忽略SSL证书错误
co.set_user_data_path(r'./UserData') # 设置独立用户目录(隔离环境)
co.incognito() # 开启无痕模式
co.headless() # 开启无头模式(不显示界面)
page = ChromiumPage(co)2. 页面操作 (Page)
控制浏览器跳转、刷新、关闭。
page.get('https://www.example.com') # 访问网页
page.refresh() # 刷新页面
page.back() # 后退
page.quit() # 关闭浏览器并退出进程3. 元素定位 (The “ele” Magic)
DrissionPage 最强大的地方:定位语法非常简洁。
- 基础定位:
page.ele('#id_name') # 按 ID 定位 (简写 #)
page.ele('.class_name') # 按 Class 定位 (简写 .)
page.ele('text:登录') # 按文本定位(包含即可)
page.ele('text=登录') # 按文本定位(必须完全匹配)
page.ele('@name=user') # 按属性定位- XPath 与 CSS 定位:
page.ele('xpath://div[@id="app"]') # 显式使用 XPath
page.ele('css:div.container') # 显式使用 CSS 选择器- 组合定位 (非常实用):
# 找一个 div,它包含文本 "提交",且 class 是 "btn"
page.ele('tag:div@@text():提交@@class:btn')4. 元素交互 (Interaction)
拿到元素后,对他做什么。
btn = page.ele('#submit')
btn.click() # 模拟物理点击
btn.input('hello world') # 输入文本
btn.clear() # 清空输入框
btn.hover() # 鼠标悬停
btn.select('选项1') # 下拉框选择5. 等待机制 (Wait)
解决“页面还没加载完就去点”导致的报错。
# 等待元素在页面上显示(最常用)
page.wait.ele_displayed('#btn', timeout=10)
# 等待元素从页面上消失
page.wait.ele_deleted('#loading')
# 强制等待 2 秒
page.wait(2) 6. Iframe 处理 (重点)
遇到嵌套页面(如富文本编辑器、登录框)时必须使用。
# 先定位到 iframe 元素,然后再执行查找
iframe = page.ele('xpath://iframe[@id="ueditor_0"]')
iframe.ele('tag:body').input('这是富文本内容')7. JS 穿透点击 (高级)
当普通的 .click() 因为被遮挡、在屏幕外或被拦截而失效时使用。
# this 代表当前定位到的这个元素
page.ele('#btn').run_js('this.click()')
# 执行任意 JS 并获取返回值
res = page.run_js('return document.title')8. 获取数据 (Extraction)
从页面上把文字或属性拿下来。
target = page.ele('#info')
print(target.text) # 获取内部文本
print(target.attr('href')) # 获取指定属性(如链接)
print(target.html) # 获取完整的 HTML 源码9. 窗口与标签页切换
当你点击链接弹出了新标签页时。
# 获取当前所有标签页的 ID 列表
tabs = page.tab_ids
# 切换到最新打开的标签页
page.get_tab(tabs[-1])
# 根据标题关键字切换标签页
tab = page.get_tab('登录页面')10. 常用参数 (Arguments) 备忘录
| 参数 | 作用 |
|---|---|
--disable-gpu | 禁用硬件加速(省资源) |
--no-sandbox | 禁用沙盒模式(解决权限问题) |
--disable-infobars | 隐藏“受到自动控制”的提示 |
--blink-settings=imagesEnabled=false | 无图模式(极大地节省内存和速度) |
关于建议
AI提供如何解决元素定位的头疼问题
首选:复制 JS 路径 (JS Path)
- 原因:它通常基于
id或唯一的选择器(如document.querySelector("#myButton"))。如果看到它生成的代码很短且带#,直接在 DrissionPage 里用page.ele('#id')即可。次选:复制 selector (CSS Selector)
- 原因:CSS 选择器通常比 XPath 更简洁,执行效率也高。
最后:复制 XPath
注意:只看它作为参考。如果它是以
//div[@id=...]开头的,勉强能用;如果是以/html/...开头的,绝对不要直接用。