DrissionPage 入门教程
与 selenium 对比
本教程共 42 篇 · 第 41 篇 · 更新于 2026-07-29 · 约 6 分钟阅读
DrissionPageDrissionPage 入门教程selenium对比迁移指南
41. 与 selenium 对比
本节目标:看看 DrissionPage 和 selenium 的差异,帮你决定是否值得切换。
代码量差距
同样一个操作,代码量差别很大。
显性等待查找元素
# selenium 写法:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
element = WebDriverWait(driver).until(
ec.presence_of_element_located(
(By.XPATH, '//*[contains(text(), "some text")]')
)
)
# DrissionPage 写法:
element = tab('some text')
切换标签页
# selenium 写法:
driver.switch_to.window(driver.window_handles[0])
# DrissionPage 写法:
tab = browser.latest_tab
选择下拉列表
# selenium 写法:
from selenium.webdriver.support.select import Select
select_element = Select(element)
select_element.select_by_visible_text('text')
# DrissionPage 写法:
element.select('text')
拖拽元素
# selenium 写法:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).drag_and_drop(ele1, ele2).perform()
# DrissionPage 写法:
ele1.drag_to(ele2)
滚动到页面底部
# selenium 写法:
driver.execute_script(
"window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);"
)
# DrissionPage 写法:
tab.scroll.to_bottom()
无头模式
# selenium 写法:
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# DrissionPage 写法:
options = ChromiumOptions().headless()
获取伪元素
# selenium 写法:
text = driver.execute_script(
'return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");',
element
)
# DrissionPage 写法:
text = element.pseudo.after
获取 shadow-root
# selenium 写法:
shadow = driver.execute_script(
'return arguments[0].shadowRoot', element
)
# DrissionPage 写法:
shadow = element.sr
XPath 获取属性或文本节点
# selenium 写法:相当复杂
# DrissionPage 写法:
class_name = element('xpath://div[@id="div_id"]/@class')
text = element('xpath://div[@id="div_id"]/text()[2]')
功能差异
| 功能 | selenium | DrissionPage |
|---|---|---|
| 浏览器自动化 | 支持 | 支持 |
| HTTP 请求 | 不支持 | SessionPage 支持 |
| 内置解析 | 不支持 | 内置 |
| 数据包模式 | 不支持 | 支持 |
| 模式切换 | 不支持 | 支持 |
| 内置下载 | 不支持 | 支持 |
| xpath 获取属性 | 很麻烦 | 简单 |
| 伪元素获取 | 需要 JS | 内置 |
| shadow-root | 功能有限 | 完整支持 |
selenium 的优势
- 生态成熟:历史悠久,社区庞大,文档丰富
- 多语言支持:Java、Python、C#、JavaScript 等
- W3C 标准:WebDriver 是 W3C 标准协议
- 企业支持:很多测试框架基于 selenium
DrissionPage 的优势
- 代码量少:API 设计更简洁,同样的功能代码更少
- 内置解析:不需要引入 lxml/BeautifulSoup
- 双模式:浏览器 + 数据包模式互通
- 中文文档:官方文档是中文,学习门槛低
- API 统一:一套语法搞定多种操作
迁移指南
如果你在用 selenium,迁移到 DrissionPage 不难。
创建浏览器
# selenium
from selenium import webdriver
driver = webdriver.Chrome()
# DrissionPage
from DrissionPage import ChromiumPage
page = ChromiumPage()
打开网页
# selenium
driver.get('https://example.com')
# DrissionPage
page.get('https://example.com')
查找元素
# selenium
element = driver.find_element(By.CSS_SELECTOR, '#id')
element = driver.find_element(By.XPATH, '//div')
# DrissionPage
element = page('#id')
element = page('xpath://div')
操作元素
# selenium
element.click()
element.send_keys('text')
text = element.text
# DrissionPage
element.click()
element.input('text')
text = element.text
执行 JavaScript
# selenium
driver.execute_script('alert(1)')
# DrissionPage
page.run_js('alert(1)')
等待
# selenium
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver, 10).until(
ec.presence_of_element_located((By.ID, 'id'))
)
# DrissionPage
page.wait.ele_display('#id', timeout=10)
注意事项
- 等待机制不同:DrissionPage 内置了隐式等待,写法更简洁
- 元素返回值:selenium 返回 WebElement,DrissionPage 返回 ChromiumElement
- 异常类型:两者抛的异常类型不同,迁移时注意捕获方式
- iframe 处理:DrissionPage 不需要切入切出
小结
DrissionPage 在 API 设计上更简洁,代码量更少。
内置了解析能力,不需要额外引入库。双模式设计是独特优势。
selenium 生态更成熟,但日常自动化任务 DrissionPage 效率更高。
迁移成本不高,核心思路一致,主要改 API 调用方式。