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