WebDriver 功能

WebDriver 功能 用于沟通会话所支持的特性。客户端也可以使用功能来定义在创建新会话时,它要求驱动满足哪些特性。

当创建一个 WebDriver 会话时,它会返回一组描述会话协商后的有效功能的集合。此集合中的一些功能是标准化的,并且在所有浏览器之间共享,但该集合也可能包含浏览器特定的功能,并且这些始终带有前缀。

功能协商

功能可用于要求支持特定功能子集的驱动。这可用于要求某些浏览器功能,例如调整窗口尺寸的能力,但也用于分布式环境中从多种选择中选择特定的浏览器配置。

选择特定的 Web 浏览器或平台仅在使用远程 WebDriver 时才有意义。在这种情况下,客户端通过一个或多个中间节点与 WebDriver 联系,这些节点会根据收到的功能协商要返回给您的驱动。

功能对象是一种选择机制,可限制服务器将返回的驱动程序的配置。如果您使用 browserName 请求 Firefox 实例,而在远程计算机上未安装 Firefox,或者在仅支持 Linux 的远程计算机上请求 macOS,则您可能运气不佳。但有时您可能不在乎您的会话使用哪个特定的操作系统或 Web 浏览器:您只想要一个具有某种功能的会话。

选择过程,或功能协商,通过 alwaysMatchfirstMatch 进行。

alwaysMatch

顾名思义,alwaysMatch 功能对象中描述的功能是您要求会话必须具备的。如果服务器无法提供您要求的功能,则会失败。

例如,如果您请求安装了 60 版本的系统上的 Firefox 62 版本,则会话创建将失败。

json
{
  "capabilities": {
    "alwaysMatch": {
      "browserName": "firefox",
      "browserVersion": "60"
    }
  }
}

firstMatch

firstMatch 字段接受一个功能对象数组,这些对象将按顺序匹配,直到其中一个与服务器可提供的内容匹配,否则将失败。

这在您想要一个在 macOS 或 Linux 上运行的驱动程序,但不是 Windows 时很有用。

json
{
  "capabilities": {
    "firstMatch": [{ "platformName": "macos" }, { "platformName": "linux" }]
  }
}

组合 alwaysMatchfirstMatch

当然,firstMatch 可以与 alwaysMatch 结合使用以缩小选择范围。例如,如果您需要一个在 macOS 或 Linux 上运行的驱动程序,但它必须是 Firefox。

json
{
  "capabilities": {
    "alwaysMatch": {
      "browserName": "firefox"
    },
    "firstMatch": [{ "platformName": "macos" }, { "platformName": "linux" }]
  }
}

前面的示例与将 Firefox 的要求放入每个 firstMatch 分支完全等效。

json
{
  "capabilities": {
    "firstMatch": [
      { "browserName": "firefox", "platformName": "macos" },
      { "browserName": "firefox", "platformName": "linux" }
    ]
  }
}

您选择前面两个示例中的哪一个并不重要,但传递浏览器配置时可能会很重要。为避免不必要地重复数据,例如配置文件,建议使用 alwaysMatch,这样数据就只需要通过网络传输一次。

json
{
  "capabilities": {
    "alwaysMatch": {
      "browserName": "firefox",
      "moz:firefoxOptions": {
        "profile": "<base64 encoded profile>",
        "args": ["-headless"],
        "prefs": { "dom.ipc.processCount": 8 },
        "log": { "level": "trace" }
      }
    },
    "firstMatch": [{ "platformName": "macos" }, { "platformName": "linux" }]
  }
}

功能列表

供应商特定的功能

除了标准功能之外,WebDriver 还允许第三方扩展功能集以满足他们的需求。浏览器供应商和驱动程序供应商通常使用扩展功能来为浏览器提供配置,但中间件也可以使用它们来传递任意数据块。

旧版功能

大多数 Selenium 客户端使用 desiredCapabilitiesrequiredCapabilities 来配置新会话。这些与上面描述的 firstMatchalwaysMatch 非常相似。一些驱动程序支持这些旧版功能,但它们已被弃用,应避免使用。

将旧版功能对象转换为新样式很容易。您首先需要知道的是,alwaysMatch/firstMatch总是包装在 capabilities JSON 对象内,而 desiredCapabilities/requiredCapabilities 存在于顶层。总的来说,以前放在 desiredCapabilities 中的任何内容都应该放在 firstMatch 分支臂中,以达到相同的效果。

以这个已弃用的功能对象为例

json
{ "desiredCapabilities": { "browserName": "firefox" } }

在新样式中,这将是功能上等效的。

json
{ "capabilities": { "firstMatch": [{ "browserName": "firefox" }] } }

但是,因为只有一个 firstMatch 分支,并且我们知道如果服务器没有安装 Firefox,会话创建将失败,所以它也等同于这个:

json
{ "capabilities": { "alwaysMatch": { "browserName": "firefox" } } }

另见