Selenium通过WebDriver操控浏览器,WebDriver不单是远程控制接口,也是W3C的推荐标准详见https://www.w3.org/TR/webdriver/。
Capabilities(功能)是WebDriver支持的标准命令之外的扩展命令,用于控制端与浏览器端之间对一些特性进行通讯,控制端可以使用Capabilities定义浏览器端创建新会话时需要满足的一些特性。浏览器端也可以用Capabilities描述会话所支持的特性集。
WebDriver支持的Capabilities分为两类,一类是标准Capabilities,一类是各WebDriver实现的特定Capabilities。
Capabilities协商机制
Capabilities对象是一种选择机制,用于限制服务器端返回的驱动程序配置。例如,我们使用BrowserNmae请求相应的Firefox实例,但是Firefox WebDriver没有安装,那么就会导致程序运行失败。
选择机制( Capabilities协商机制)通过alwaysMatch和firstMatch这两个对象实现。
alwaysMatch对象
顾名思义,alwaysMatch对象中描述的功能是我们要求会话具备的功能。如果服务器无法提供所需功能,会话将创建失败。
例如:你要求会话使用Firefox 的版本为62,但是安装的Firefox 的版本为60,那么会话将创建失败。
{
"capabilities": {
"alwaysMatch": {
"browserName": "firefox",
"browserVersion": "62"
}
}
}
firstMatch对象
firstMatch对象接收一个功能(Capabilities)数组,这些对象将依次匹配,直到匹配服务器可以提供的功能,会话将创建失败。
例如,你想在macOS或Linux上运行驱动程序,而非Windows上。
{
"capabilities": {
"firstMatch": [
{"platformName": "macos"},
{"platformName": "linux"}
]
}
}
alwaysMatch和firstMatch结合使用
alwaysMatch与firstMatch可以结合使用以缩小选择范围。
例如:你想在macOS或Linux上运行驱动程序,而且要求浏览器必须是FireFox。
{
"capabilities": {
"alwaysMatch": {
"browserName": "firefox"
},
"firstMatch": [
{"platformName": "macos"},
{"platformName": "linux"}
]
}
}
前面的示例完全等同于将Firefox要求放到每个firstMatch分支中。但是强烈建议使用第一种形式,这样不必重复传递大量数据。
{
"capabilities":{
"firstMatch":[
{"browserName": "firefox", "platformName":"macos"},
{"browserName": "firefox", "platformName":"linux"}
]
}
}
标准Capabilities
| 功能 | 键 | 值类型 | 说明 |
|---|---|---|---|
| 浏览器名称 | “browserName” | string | 用于设置指定会话的浏览器名称。如果未安装指定的浏览器,则会话创建将失败。通过UA检查。 |
| 浏览器版本 | “browserVersion” | string | 用于设置指定会话的浏览器版本。通过UA检查。 |
| 操作系统版本 | “platformName” | string | 用于检查操作系统版本。 |
| 是否接受不安全的认证 | “acceptInsecureCerts” | boolean | 设置不受信任的和自签名的TLS证书是否隐式受信任。 |
| 页面加载策略 | “pageLoadStrategy” | string | 定义当前会话的页面加载策略,可参考document.readyState。 |
| 代理设置 | “proxy” | JSON | 定义当前会话的代理设置 |
| 改变窗口大小、位置 | “setWindowRect” | boolean | 设置是否支持重置窗口大小和位置的命令 |
| 会话超时 | “timeouts” | JSON | 描述会话操作的超时设置 |
| 严格文件交互性检查 | “strictFileInteractability” | boolean | 严格文件交互性检查 |
| 提示框处理策略 | “unhandledPromptBehavior” | string | 描述当前会话提示框处理策略,默认是dismiss and notify state |
特定Capabilities
除了标准Capabilities,不同WebDriver实现还可以根据需求扩展Capabilities,FireFox主要通过FirefoxOptions实现特定Capabilities。
根据文档https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions可知,FirefoxOptions是一个JSON对象,包含以下字段:
-
binary:字符串。自定义Firefox二进制文件所在的绝对路径。Windows会默认注册表HKEY_LOCAL_MACHINE\SOFTWARE WOW6432Node\Mozilla\Mozilla Firefox\[VERSION]\Main\PathToExe、
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\[VERSION]\Main\PathToExe中的路径查找。 -
args:字符串数组。向Firefox二进制文件传递的命令行参数。例如- headless。支持的参数详见https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options。 -
profile:字符串。Firefox实例的用户配置文件目录。可用于安装扩展或者自定义证书。但是对于设置自定义首选项,官方建议使用prefs对象 (Preferences Object) 。
配置文件是在系统临时文件夹中创建的。这也是在提供编码概要文件时提取的地方 profile。默认情况下,geckodriver将在此位置创建一个新的配置文件。
如果想要让geckodriver使用现有配置文件,请将args字段设置为{"args": ["-profile", "/path/to/your/profile"]}。 -
prefs(Preferences object):首选项名称和值的映射。值可以是字符串、布尔值或整数。
Preferences object是一个JSON对象,每个首选项都是一个键值对。在启动Firefox之前,首选项将被写入配置文件(profile)。可以通过在Firefox浏览器中访问about:config获得可用首选项的完整列表(4千多项……)。其中一些重要的首选项参见https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preference_reference。
例如:{ "dom.ipc.processCount": 8, "javascript.options.showInConsole": false } -
env(Env object):环境变量名称和值的映射。
Env object是一个JSON对象,每个环境变量都是一个键值对。在桌面端,Firefox将使用给定的环境变量启动。
desiredCapabilities和requiredCapabilities
大部分Selenium API都支持使用desiredCapabilities和requiredCapabilities来配置新会话。他们与前面提到的alwaysMatch和firstMatch对象非常相似。但是desiredCapabilities和requiredCapabilities已逐步废弃,应当避免使用。
{"desiredCapabilities": {"browserName": "firefox"}}
上述对象应当转换为:
{"capabilities": {"firstMatch": [{"browserName": "firefox"}]}}
参考文献
https://www.w3.org/TR/webdriver/#capabilities
https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities
https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
https://docs.mozilla.org/testing/geckodriver/Capabilities.html#capabilities-example
https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preference_reference
https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options
Selenium WebDriver与Capabilities详解
本文介绍了Selenium WebDriver的工作原理及Capabilities的使用方法,Capabilities包括alwaysMatch和firstMatch两个对象,用于限定创建会话时所需的浏览器特性。文章还详细解释了标准Capabilities与特定Capabilities的区别,并提供了FirefoxOptions的配置示例。
177

被折叠的 条评论
为什么被折叠?



