DrissionPage自动化框架

6 min

DrissionPage py自动化框架

使用时遇到的问题记录

记录控制浏览器时遇到的难点

  1. 富文本(UEditor)提交为空

    • 问题所在:粘贴 (Ctrl+V) 后,内容仅在视觉层,未同步到底层表单。直接提交会导致后端接收为空。
    • 解决方法
      • 手动触发失焦 (Blur):粘贴后,先点击页面空白处或标题框,强迫编辑器同步数据:
  2. 找不到元素(最常见的坑)

    • 问题所在:目标元素在 iframe 里,直接用 page.ele 找不到。

    • 解决方案:

      • 先定位 iframe 再查找:

        iframe = page.ele('xpath://iframe...')
        btn = iframe.ele('...')

    • 之后又遇到的问题:点击提交后无反应

      • 问题所在:按钮被富文本编辑器的工具栏遮挡
      • 解决方案:
        • 定位到该元素之后:btn1 = page.ele('xpath:(//button[@class="submit"])[1]')
        • 使用jsbtn.run_js('this.click()')
  3. 无痕模式下,访问http网站出现不安全报错

    • 问题是:“忽略”按钮无法被定位到
    • 解决方案:
      • 目前了解的是,无法解决,因为这个风险提示页面是一个浏览器特殊的页面(待定,如果未来发现解决方案再补充)
  4. 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提供如何解决元素定位的头疼问题

  1. 首选:复制 JS 路径 (JS Path)

    • 原因:它通常基于 id 或唯一的选择器(如 document.querySelector("#myButton"))。如果看到它生成的代码很短且带 #,直接在 DrissionPage 里用 page.ele('#id') 即可。

    次选:复制 selector (CSS Selector)

    • 原因:CSS 选择器通常比 XPath 更简洁,执行效率也高。

    最后:复制 XPath

    • 注意:只看它作为参考。如果它是以 //div[@id=...] 开头的,勉强能用;如果是以 /html/... 开头的,绝对不要直接用。