一、核心区别概述
Browser 库和 SeleniumLibrary 在 Robot Framework 中用法非常相似,关键区别在于底层驱动机制:SeleniumLibrary 基于 Selenium WebDriver 驱动浏览器,而 Browser 库基于 Playwright 驱动浏览器。这一技术栈差异带来了以下几个方面的影响:
| 对比维度 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 底层技术 | Selenium WebDriver | Playwright (Node.js) |
| 浏览器驱动 | 需要独立的 WebDriver | 内置浏览器二进制文件,无需额外驱动 |
| 执行速度 | 基准速度 | 测试执行速度提升约 50% |
| 浏览器支持 | Chrome, Firefox, Edge, Safari | Chromium, Firefox, WebKit, Edge(原生支持) |
| 自动等待机制 | 需要显式或隐式等待(约 40% 测试失败由时序问题导致) | 内置智能自动等待 |
| Shadow DOM 支持 | 不支持,需要复杂变通方案 | 原生支持穿透 Shadow DOM |
| 上下文隔离 | 每个浏览器需独立进程 | 支持多上下文,比 Selenium 快约 10 倍 |
| 关键字总数 | 约 180+ 个 | 约 118+ 个 |
| 生态系统 | 成熟,资源丰富 | 较新,资源相对少 |
注意:两个库不能混用——不能用 SeleniumLibrary 打开浏览器后用 Browser 库的关键字操作,必须完全使用其中一种。
二、浏览器与窗口管理
2.1 打开浏览器
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 打开浏览器 | Open Browser url browser |
New Browser browser headless=False + New Context + New Page url |
| 快速打开(一次性) | — | Open Browser url browser(相当于三合一便捷方法) |
| 创建无头浏览器 | 添加参数 headlesschrome 等 |
New Browser 默认 headless=True |
| 创建持久化上下文 | — | New Persistent Context url browser |
SeleniumLibrary 中 Open Browser 一次性打开浏览器并导航到指定 URL。Browser 库采用 Browser → Context → Page 三层架构设计,更灵活但也更复杂:
robotframework
# SeleniumLibrary 写法
*** Settings ***
Library SeleniumLibrary*** Test Cases ***
Open GoogleOpen Browser https://www.google.com chrome# Browser 库写法
*** Settings ***
Library Browser*** Test Cases ***
Open GoogleNew Browser chromium headless=falseNew Context viewport={'width': 1920, 'height': 1080}New Page https://www.google.com
Browser 库也提供了 Open Browser 关键字作为便捷方法,等价于一次性执行 New Browser + New Context + New Page,适用于快速实验或调试场景。
2.2 关闭浏览器/窗口
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 关闭当前浏览器 | Close Browser |
Close Browser |
| 关闭所有浏览器 | Close All Browsers |
Close Browser ALL |
| 关闭当前页面 | Close Window |
Close Page |
| 关闭当前上下文 | — | Close Context |
2.3 窗口/标签页切换
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 切换窗口 | Switch Window locator=NEW |
Switch Page NEW |
| 通过标题切换 | Switch Window title=xxx |
Switch Page url=xxx 或 title=xxx |
| 获取窗口句柄列表 | Get Window Handles |
Get Page Ids |
| 获取当前窗口信息 | Get Window Titles |
Get Title |
2.4 页面导航
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 跳转到 URL | Go To url |
Go To url |
| 刷新页面 | Reload Page |
Reload |
| 后退 | Go Back |
Go Back |
| 前进 | — | Go Forward |
| 获取当前 URL | Get Location |
Get Url |
| 验证 URL | Location Should Be url |
Get Url == url |
三、元素交互
3.1 点击操作
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 点击元素(通用) | Click Element locator |
Click selector |
| 点击按钮 | Click Button locator |
Click selector(通用) |
| 点击链接 | Click Link locator |
Click selector(通用) |
| 双击元素 | Double Click Element locator |
Double Click selector |
| 右键点击 | Open Context Menu locator |
Click selector button=right |
| 点击坐标 | Click Element At Coordinates |
Click x=... y=... |
| 点击图片 | Click Image locator |
使用 Click 配合图片选择器 |
| 选中复选框 | Select Checkbox locator |
Check Checkbox selector |
| 取消复选框 | Unselect Checkbox locator |
Uncheck Checkbox selector |
| 选择单选按钮 | Select Radio Button |
Click selector |
Browser 库的 Click 关键字是统一的点击入口,不再区分 Button、Link、Element 等类型,这简化了 API 但丢失了一些语义信息。
3.2 文本输入
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 输入文本 | Input Text locator text |
Fill Text selector text 或 Type Text selector text |
| 输入密码 | Input Password locator password |
Fill Secret selector password |
| 清空输入框 | Clear Element Text locator |
Clear Text selector |
| 模拟键盘按键 | Press Keys locator keys |
Keyboard Key press key |
| 逐字输入(模拟打字) | — | Type Text selector text delay=100ms |
Fill Text 会先清空输入框再填入内容;Type Text 则逐个字符输入,可设置延迟来模拟真实用户打字行为。
3.3 下拉列表选择
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 按值选择 | Select From List By Value |
Select Options By selector value |
| 按标签选择 | Select From List By Label |
Select Options By selector label |
| 按索引选择 | Select From List By Index |
Select Options By selector index |
| 获取选中项标签 | Get Selected List Label |
Get Selected Options selector then label |
| 获取选中项值 | Get Selected List Value |
Get Selected Options selector then value |
| 取消选择 | Unselect From List By ... |
Deselect Options selector |
3.4 文件上传
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 选择文件上传 | Choose File locator file_path |
Upload File selector file_path |
3.5 鼠标操作
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 鼠标悬停 | Mouse Over locator |
Hover selector |
| 拖拽 | Drag And Drop from to |
Drag And Drop from to |
| 拖拽偏移 | Drag And Drop By Offset |
Drag And Drop By Offset |
| 鼠标按下 | Mouse Down locator |
Mouse Button down |
| 鼠标松开 | Mouse Up locator |
Mouse Button up |
| 鼠标移动 | — | Mouse Move x y |
| 虚拟鼠标控制 | — | Mouse Move 和 Mouse Button 配合实现虚拟鼠标 |
四、元素查找与获取信息
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 获取文本 | Get Text locator |
Get Text selector |
| 获取属性 | Get Element Attribute locator attr |
Get Attribute selector attr |
| 获取元素数量 | Get Element Count locator |
Get Element Count selector |
| 获取元素 | Get WebElement locator |
Get Element selector |
| 获取元素列表 | Get WebElements locator |
Get Elements selector |
| 获取页面标题 | Get Title |
Get Title |
| 获取页面源码 | Get Source |
Get Page Source |
选择器(定位符)策略对比
两个库在选择器语法上略有差异:
| 选择器类型 | SeleniumLibrary | Browser 库 |
|---|---|---|
| CSS(默认) | css=.class 或直接写 .class |
直接写 .class(默认 CSS) |
| XPath | xpath=//div 或以 // 开头 |
以 // 开头自动识别为 XPath |
| ID | id=foo |
#foo(CSS)或 id=foo |
| Name | name=foo |
[name="foo"](CSS) |
| 文本匹配 | — | text="Login" 或 "Login" |
| 链式选择器 | 不支持原生 | 支持 >> 链式(如 #iframe >> #btn) |
Browser 库的选择器功能更强大,支持文本引擎 text="Login" 直接按文本定位,以及 >> 链式选择器来穿透 Shadow DOM 和 iframe。
五、等待机制
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 设置隐式等待 | Set Selenium Implicit Wait |
Set Browser Timeout |
| 等待元素可见 | Wait Until Element Is Visible |
Wait For Elements State selector visible |
| 等待元素不可见 | Wait Until Element Is Not Visible |
Wait For Elements State selector hidden |
| 等待元素启用 | Wait Until Element Is Enabled |
Wait For Elements State selector enabled |
| 等待包含元素 | Wait Until Page Contains Element |
Wait For Elements State selector attached |
| 等待页面包含文本 | Wait Until Page Contains |
Wait For Elements State text="xxx" visible |
| 等待条件为真 | — | Wait For Condition condition |
| 等待网络空闲 | — | Wait For Load State networkidle |
| 固定等待 | Sleep seconds |
Sleep seconds |
Browser 库的最大优势之一是其内置的自动等待机制:交互前会自动等待元素可操作,因此通常不需要编写大量显式等待语句,大大减少了测试的不稳定性。
robotframework
# SeleniumLibrary 典型写法
Click Element id=submit-btn
Wait Until Element Is Visible css=.success-message
Element Text Should Be css=.success-message Operation successful# Browser 库写法(自动等待)
Click id=submit-btn
Get Text css=.success-message == Operation successful
六、断言与验证
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 页面应包含文本 | Page Should Contain text |
Get Text body contains text |
| 页面不应包含文本 | Page Should Not Contain text |
Get Text body not contains text |
| 元素应可见 | Element Should Be Visible |
Get Element State selector == visible |
| 元素应不可见 | Element Should Not Be Visible |
Get Element State selector == hidden |
| 元素应启用 | Element Should Be Enabled |
Get Element State selector == enabled |
| 元素应禁用 | Element Should Be Disabled |
Get Element State selector == disabled |
| 元素文本应为 | Element Text Should Be text |
Get Text selector == text |
| 元素应包含 | Element Should Contain text |
Get Text selector contains text |
| 复选框应选中 | Checkbox Should Be Selected |
Get Checkbox State selector == checked |
| 属性值应为 | Element Attribute Value Should Be |
Get Attribute selector attr == value |
Browser 库采用了一种更统一的断言模式:关键字返回状态值,然后使用 ==、contains、should be 等运算符进行断言,支持 validate 和 then 闭包进行更复杂的条件判断。
robotframework
# Browser 库的断言模式示例
Get Text css=h1 == Welcome
Get Title == Home Page
Get Url contains /dashboard
Get Element State #submit-btn == enabled
七、弹窗与对话框
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 处理 Alert | Handle Alert action=ACCEPT |
Handle Future Dialogs action=accept |
| Alert 文本应为 | Alert Should Be Present text |
结合 Handle Future Dialogs 和 promise |
| 获取 Alert 文本 | Get Alert Message |
使用 Promise 方式 |
| 输入 Alert 文本 | Input Text Into Alert |
Handle Future Dialogs prompt_input=text |
| 确认 Alert 不存在 | Alert Should Not Be Present |
— |
| 处理文件选择对话框 | — | Handle Future Dialogs action=accept |
Browser 库对弹窗的处理采用“预注册”模式——必须在触发弹窗的操作之前调用 Handle Future Dialogs,这与 SeleniumLibrary 的事后处理模式不同:
robotframework
# Browser 库弹窗处理模式
Handle Future Dialogs action=accept
Click #trigger-alert-btn
八、框架与多文档
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 选择 Frame | Select Frame locator |
链式选择器 #iframe >> #element 或 Switch Context |
| 取消选择 Frame | Unselect Frame |
链式选择器默认只对单次操作有效 |
| 当前 Frame 应包含 | Current Frame Should Contain text |
Get Text body contains text |
| 穿透 Shadow DOM | 不支持,需要复杂脚本 | 原生支持,CSS 选择器自动穿透 |
Browser 库处理 iframe 和 Shadow DOM 的最大优势是无需显式切换上下文。通过 >> 链式选择器可以直接定位到嵌套元素:
robotframework
# Browser 库穿透 iframe 和 Shadow DOM 的方式
Click #iframe-id >> #inner-button
Click #shadow-host >> #shadow-element
九、Cookie 管理
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 获取 Cookies | Get Cookies |
Get Cookies |
| 获取单个 Cookie | Get Cookie name |
Get Cookie name |
| 添加 Cookie | Add Cookie name value |
Add Cookie name=value |
| 删除 Cookie | Delete Cookie name |
Delete Cookie name |
| 删除所有 Cookies | Delete All Cookies |
Delete All Cookies |
| 保存 Cookies 到文件 | — | Save Storage State |
| 加载 Cookies 从文件 | — | Load Storage State |
Browser 库新增的 Save Storage State / Load Storage State 可以保存和恢复完整的会话状态(包括 cookies 和 localStorage),便于实现登录态复用。
十、截图与调试
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 截取页面截图 | Capture Page Screenshot filename |
Take Screenshot filename |
| 截取元素截图 | Capture Element Screenshot locator |
Take Screenshot selector=xxx |
| 测试录像 | 不支持 | New Context recordVideo={'dir': 'videos'} |
| 追踪调试 | 不支持 | New Context 启用 tracing 功能 |
| 获取页面 PDF | — | Get Pdf |
Browser 库在调试和测试可观测性方面更强大,支持测试录像和 Playwright Trace Viewer,便于排查问题。
十一、JavaScript 执行
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 执行 JavaScript | Execute Javascript code |
Execute JavaScript code |
| 执行异步 JavaScript | Execute Async Javascript code |
Execute JavaScript(支持 Promise) |
| 获取 JavaScript 返回值 | 直接返回 | Execute JavaScript code then value |
Browser 库的 Execute JavaScript 函数参数可以是匿名函数或函数名,返回 Promise 时自动等待。
十二、网络拦截与 Mock
| 功能 | SeleniumLibrary | Browser 库 |
|---|---|---|
| 拦截请求 | 不支持 | Route url handler |
| Mock 响应 | 不支持 | Route url fulfill |
| 继续请求 | 不支持 | Route url continue |
| 终止请求 | 不支持 | Route url abort |
| 等待请求/响应 | 不支持 | Wait For Request / Wait For Response |
| 获取网络日志 | 部分支持(需额外配置) | Promise To Wait For Request |
这是 Browser 库的独特功能,内置网络拦截和请求 Mock 能力,可以模拟 API 响应、测试网络错误场景,而 SeleniumLibrary 需要借助外部代理工具才能实现。
十三、总结与选择建议
选择 SeleniumLibrary 的场景:
- 项目已有大量 SeleniumLibrary 测试用例,且运行稳定
- 需要与 Selenium Grid 集成实现分布式测试
- 团队对 Selenium 生态非常熟悉
- 测试老旧浏览器版本(Playwright 仅支持较新版本)
- 需要更丰富的第三方集成和社区资源
选择 Browser 库的场景:
- 新项目,没有历史包袱
- 测试 React、Vue 等现代框架(需处理 Shadow DOM)
- 追求更快的执行速度和更高的稳定性
- 需要录像、trace 等调试功能
- 需要网络拦截/Mock 能力
- 希望减少 flaky tests 和等待代码
迁移建议
如需从 SeleniumLibrary 迁移到 Browser 库,可以使用 robotframework-browser-migration 工具包:它包含一个分析脚本(统计项目中使用的 SeleniumLibrary 关键字)和一个迁移层库 SeleniumLibraryToBrowser,该库使用 Browser 库实现了约 80% 的 SeleniumLibrary 关键字,可以大幅降低迁移工作量。
