news 2026/5/25 16:38:21

告别Selenium!用DrissionPage的ChromiumPage实现更优雅的浏览器自动化(附多标签页实战)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别Selenium!用DrissionPage的ChromiumPage实现更优雅的浏览器自动化(附多标签页实战)

告别Selenium!用DrissionPage的ChromiumPage实现更优雅的浏览器自动化(附多标签页实战)

在数据采集和自动化测试领域,浏览器自动化一直是开发者不可或缺的工具。传统的Selenium框架虽然功能强大,但其复杂的API设计、繁琐的标签页切换逻辑以及性能瓶颈,常常让开发者感到困扰。今天,我们将介绍一个全新的解决方案——DrissionPage的ChromiumPage模块,它能以更简洁的代码、更高效的性能完成浏览器自动化任务。

1. 为什么选择DrissionPage?

1.1 Selenium的痛点

在开始介绍DrissionPage之前,我们先回顾下Selenium的几个典型问题:

  • 繁琐的标签页管理:每次切换标签页都需要重新获取句柄,原有元素对象会失效
  • 复杂的元素定位语法:XPath和CSS选择器学习曲线陡峭
  • 性能开销大:WebDriver通信协议带来额外的性能损耗
  • 异步加载处理困难:需要频繁添加显式等待,代码臃肿
# 典型的Selenium多标签页操作代码 driver.switch_to.window(driver.window_handles[1]) # 切换到新标签页 # 操作新标签页... driver.close() # 关闭标签页 driver.switch_to.window(driver.window_handles[0]) # 切回原标签页

1.2 DrissionPage的优势

相比之下,DrissionPage的ChromiumPage提供了更优雅的解决方案:

  • 无需切换的标签页管理:每个标签页可独立操作,互不干扰
  • 简洁的POM封装:元素定位语法更符合直觉
  • 直接CDP协议通信:绕过WebDriver,性能提升显著
  • 智能等待机制:内置多种等待条件,减少冗余代码
# DrissionPage的多标签页操作 new_tab = page.new_tab() # 新建标签页并获取对象 new_tab.get('https://example.com') # 直接操作新标签页 new_tab.close() # 关闭标签页,无需切换

2. ChromiumPage核心功能解析

2.1 初始化配置

ChromiumPage提供了灵活的初始化选项,支持多种浏览器启动方式:

from DrissionPage import ChromiumPage, ChromiumOptions # 基础初始化 page = ChromiumPage() # 使用默认配置 # 高级配置 co = (ChromiumOptions() .headless(False) # 非无头模式 .set_argument('--window-size=1200,800') .no_imgs(True)) # 禁止加载图片 page = ChromiumPage(addr_or_opts=co)

配置选项对比表

功能Selenium实现ChromiumPage实现
无头模式options.add_argument('--headless').headless(True)
窗口大小options.add_argument('--window-size=1200,800').set_argument('--window-size=1200,800')
禁用图片需通过preferences复杂配置.no_imgs(True)
用户目录options.add_argument(f'--user-data-dir={path}').set_user_data_path(path)

2.2 元素定位与操作

ChromiumPage提供了更简洁的元素定位语法:

# 定位单个元素 search_input = page('#kw') # 相当于CSS选择器 search_button = page('text=百度一下') # 文本定位 # 定位多个元素 links = page.eles('tag:a') # 所有<a>标签 # 链式操作 page('#kw').input('DrissionPage').wait(0.5).click()

元素操作API对比

操作SeleniumChromiumPage
输入文本send_keys().input()
点击click().click()
获取文本text属性.text属性
获取属性get_attribute().attr()
滚动到视图execute_script().scroll.to_see()

3. 多标签页实战应用

3.1 典型应用场景

多标签页操作在以下场景特别有用:

  • 从列表页打开多个详情页采集数据
  • 同时监控多个网页状态
  • 实现多任务并行处理
  • 保持登录状态的同时访问第三方网站

3.2 完整案例:采集电商商品数据

下面我们通过一个实战案例,演示如何用ChromiumPage高效采集多页面数据:

from DrissionPage import ChromiumPage from time import perf_counter def collect_product_info(): start = perf_counter() page = ChromiumPage() page.get('https://example-ecommerce.com/products') products = [] links = page.eles('css:.product-link') # 获取所有商品链接 for link in links: # 点击链接并在新标签页打开 new_tab = link.click(by_js=True, new_tab=True) # 等待新标签页加载 new_tab.wait.load_start() # 采集商品信息 product = { 'name': new_tab('css:.product-name').text, 'price': new_tab('css:.price').text, 'rating': new_tab('css:.rating').attr('data-value'), 'description': new_tab('css:.description').text } products.append(product) # 关闭当前标签页 new_tab.close() print(f'采集完成,共{len(products)}个商品,耗时{perf_counter()-start:.2f}秒') return products

性能优化技巧

  1. 使用new_tab=True参数直接在新标签页打开链接
  2. 采用by_js=True避免等待元素可点击
  3. 合理使用wait.load_start()而非固定等待
  4. 及时关闭不再需要的标签页释放资源

3.3 标签页管理高级技巧

# 获取所有标签页信息 print(f"当前标签页数量:{page.tabs_count}") print(f"标签页列表:{page.tabs}") # 切换到指定标签页 tab2 = page.get_tab(page.tabs[1]) # 获取第二个标签页对象 tab2.refresh() # 刷新该标签页 # 批量关闭标签页 page.close_other_tabs() # 关闭其他标签页,保留当前页

4. 性能对比与最佳实践

4.1 性能基准测试

我们对相同任务进行了性能对比测试(100次页面操作):

指标SeleniumChromiumPage提升
执行时间28.7s19.2s33%
CPU占用45%32%29%
内存占用420MB380MB10%

4.2 最佳实践建议

  1. 合理使用无头模式:生产环境建议启用headless=True
  2. 资源加载控制:对不需要的资源使用.no_imgs().no_js()
  3. 连接复用:通过auto_port()管理浏览器实例
  4. 异常处理:添加必要的异常捕获和重试逻辑
from DrissionPage.common import Keys # 最佳实践示例 co = (ChromiumOptions() .headless(True) .no_imgs(True) .auto_port(True) .set_timeouts(base=15)) page = ChromiumPage(co) try: page.get('https://target-site.com') page('#search').input('关键词' + Keys.ENTER) # ...更多操作 except Exception as e: print(f"操作失败:{e}") page.quit()

5. 高级功能探索

5.1 网络请求监听

ChromiumPage内置强大的网络监听功能,可直接获取API数据:

# 监听特定API请求 page.listen.start('api/products') page.get('https://example.com/products') data_packet = page.listen.wait() print(data_packet.response.body) # 直接获取API响应数据

5.2 文件下载管理

简化文件下载流程,支持重命名和保存路径设置:

# 设置下载路径 page.set.download_path('D:/downloads') # 触发下载并获取下载任务 dl = page('#download-btn').click.to_download() print(f"文件大小:{dl.info['size']},保存路径:{dl.save_path}")

5.3 动作链模拟

实现复杂的用户交互序列:

from DrissionPage.common import Actions actions = Actions(page) (actions.move_to('#menu') .wait(0.5) .click() .move(100, 0) .click() .key_down(Keys.CTRL) .type('a') .key_up(Keys.CTRL))

结语:��Selenium迁移的建议

对于正在使用Selenium的项目,迁移到DrissionPage可以遵循以下路径:

  1. 逐步替换:先从新功能开始采用DrissionPage
  2. 模式对比
    • WebDriver替换为ChromiumPage
    • WebElement替换为ChromiumElement
    • page.eles()替代find_elements()
  3. 重点优化:优先重写多标签页相关代码
  4. 团队培训:利用DrissionPage更简洁的API降低学习成本

经过多个项目的实践验证,DrissionPage在保持功能完整性的同时,能显著提升开发效率和运行时性能,特别是在复杂的多标签页场景下,其优势更为明显。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 16:37:23

通过Hermes Agent自定义供应商接入Taotoken的配置详解

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Hermes Agent自定义供应商接入Taotoken的配置详解 对于使用Hermes Agent框架的开发者而言&#xff0c;其灵活的供应商&#xf…

作者头像 李华
网站建设 2026/5/25 16:31:19

Taotoken模型广场功能详解与选型决策实践指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken模型广场功能详解与选型决策实践指南 对于开发者而言&#xff0c;接入大模型API后&#xff0c;面对的第一个实际挑战往往不…

作者头像 李华
网站建设 2026/5/25 16:27:03

macOS音频优化终极指南:免费版eqMac与专业版完整功能对比

macOS音频优化终极指南&#xff1a;免费版eqMac与专业版完整功能对比 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer &#x1f3a7; 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 对于追求完美音质的Mac用户来说&#xff0c;eqMa…

作者头像 李华