💥 5.0 功能介绍
作者 2024 年底开始非常忙碌,一年多没空推进开发。到 2026 年终于能抽出时间继续了。
但此时 AI 已变天,自动化工具不知道是否还有必要。
迷惘后决定还是继续前进,因为写程序本身是我的乐趣,不想失去,并且 AI 也给我带来了很大的便利。
在 AI 的大趋势下,自动化工具该怎么设计,希望大家留言交流。
‼️ 不要再用 Page 对象了!
从 4.1 开始我就呼吁不要再用ChromiumPage和WebPage,因已有大量项目在使用而保留。
不知道为什么,网上搜一下很多教程都在使用,AI 给的结果也是, 导致用的人数似乎没有减少。
但是,随着新功能的开发,这种混合设计逐渐成为阻碍,带来逻辑混肴和维护复杂性。
为了后续发展,统一使用体验,经过 20 个测试版的实践,思考再三后决定将它们删除。
同时,ChromiumTab增加模式切换功能。
✔️ 推荐写法
from DrissionPage import Chromium
browser = Chromium()
tab = browser.latest_tab
❌️ 不推荐写法
from DrissionPage import ChromiumPage
page = ChromiumPage()
✅️ 重构底层逻辑,优化资源占用
5.0 对底层逻辑进行了全面重构,大幅降低内存占用,提升运行效率。
同时优化底层逻辑,为后续更多功能铺路。
早期 DrissionPage 开发摸着石头过河,留下了一些顽疾,希望在这个版本能很好地解决。
✅️ 支持独立浏览器上下文
5.0 可以创建建独立的上下文对象。
每个上下文对象的 cookies 是独立的,可视作一个无痕浏览器,并且可以独立设置代理。
因此可以实现一个浏览器登录多个账号及动态设置代理的功能。
📌 新建上下文
用Chromium对象的new_context()方法新建一个BrowserContext对象。
刚新建时这个浏览器是不可见的,需用这个对象新建一个标签页才会出现。
from DrissionPage import Chromium
browser = Chromium()
context = browser.new_context(proxy='127.0.0.1:7890') # 创建新上下文并独立设置代理
tab = context.new_tab()
tab.get('https://DrissionPage.cn')
📌 方法和属性
tab_ids:返回该上下文中所有标签页 idlatest_tab:返回该上下文中最后一个激活的标签页对象cookies():返回该上下文 中所有 cookiesnew_tab():在该上下文中新建一个标签页get_tab():按照指定条件在该上下文中查找一个标签页get_tabs(): 按照指定条件在该上下文中查找标签页,返回所有close():关闭该上下文,内部标签页会同时被关闭set.cookies():设置该上下文 cookiesset.cookies.clear():清空该上下文 cookiesset.perm.****():设置该上下文各种权限wait.new_tab():等待新标签页出现
✅️ 支持跨域操作
5.0 支持跨域<iframe>元素获取及数据监听。
如使用中发现问题,可用ChromiumOptions对象设置关闭该功能。
from DrissionPage import ChromiumOptions
co = ChromiumOptions().close_cross_origin()
📌 直接获取跨域 iframe 内元素
现在可以直接用 tab 对象获取跨域<iframe>内的元素,而不用先获取元素对象了。
可用在此测试页面进行测试。
此功能需用 DrissionPage 启动的浏览器,或使用'--disable-site-isolation-trials'参数启动的浏览器才能实现。
新版本:
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('https://drissionpage.cn/demos/iframe_diff_domain.html')
ele = tab('新闻')
print(ele)
旧版本
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('https://drissionpage.cn/demos/iframe_diff_domain.html')
iframe = tab.get_frame('t:iframe')
ele = iframe('新闻')
print(ele)
📌 跨域数据包监听
现在可以直接用 Tab 对象直接监听内部跨域<iframe>的数据包,而不用先获取元素。
此功能需用 DrissionPage 启动的浏览器,或使用'--disable-site-isolation-trials'参数启动的浏览器才能实现。
新版本:
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.listen.start('https://www.163.com')
tab.get('https://drissionpage.cn/demos/iframe_diff_domain.html')
res = tab.listen.wait()
print(res)
旧版本:
from DrissionPage import Chromium
tab = Chromium().latest_tab
iframe = tab.get_frame('t:iframe')
iframe.listen.start('163.com')
iframe.get('https://www.163.com')
res = iframe.listen.wait()
print(res)
✅️ 升级数据监听
5.0 新增支持 ws 和 sse 监听,支持全局监听,并优化了监听目标设置方式。
📌 API 变化
listen.start()方法删除method和res_type参数listen.set_targets()方法删除method和res_type参数- 新增
listen.set_method()和listen.set_res_type()方法
如果要设置监听的 method 或 resourceType,以前的写法是:
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.listen.set_targets(method=('GET', 'POST'), res_type='WebSocket')