开发一个好的 Web 应用程序意味着它可用、功能齐全且兼容。 严格的端到端测试可确保推出稳定的 Web 应用程序。 在所有可能的浏览器上进行测试可确保提供出色的用户体验。

Nightwatch 是一款针对 Web 应用程序的端到端自动化测试解决方案。 开发人员和测试工程师可以使用 Nightwatch 编写测试,并轻松地针对各种浏览器进行测试,无需担心测试不稳定。

假设您有一个在不同操作系统机器上运行不同浏览器的基础设施设置。 现在,测试和基础设施已准备就绪。 但是,我们如何将测试委派到基础设施上运行呢? 好吧,Selenium Grid 无缝地将两者连接在一起。 Selenium Grid 有助于有效地找到准确的环境来运行测试。

什么是 Selenium Grid?

Selenium Grid 是一个中心点,有助于分布式测试、扩展多个环境以及负载均衡传入测试。 Grid 通过支持跨多个浏览器-操作系统组合的并行测试来提高测试效率。 所有测试都指向 Grid,它会智能地将它们路由到底层基础设施上运行。

如果您有本地或云设备农场,Selenium Grid 将处理 Web 测试的所有委派需求。

Grid Architecture

Selenium Grid 的功能分为以下几个组件:

路由器

顾名思义,路由器的主要职责是将请求路由到正确的组件。 任何对 Selenium Grid 的请求首先都会到达路由器。 根据请求,路由器会识别可以处理该请求的 Grid 组件。

分发器

分发器维护所有已注册节点的模型。 分发器将新的会话请求匹配到相应的节点,并启动会话创建。 它还会定期 ping 节点的健康检查,并跟踪节点的心跳。

节点

节点存在于承载操作系统和浏览器(s)的机器上。 因此,节点会与 Web 驱动程序交互,并将浏览器命令转发给它们。 每个节点都包含一组功能。 功能是浏览器名称、浏览器版本和操作系统的组合。

启动后,节点会在 Grid 上注册自己。 分发器处理节点注册。

会话映射

会话映射包含会话 ID 和运行会话的节点之间的映射。 对于每个对现有会话的请求,路由器都会使用会话映射查找节点并将请求转发到相应的节点。

新会话队列

新会话队列将每个新的会话请求排队。 新会话队列是 FIFO 队列。 同时,分发器会定期检查是否有任何节点具有新会话的容量。 如果是这样,分发器会阻塞节点中的匹配插槽,并将请求从新会话队列中移除。 节点创建会话并响应客户端。

新会话队列还具有请求重试和请求超时机制。

事件总线

Grid 组件利用事件总线,使用消息相互交互。 Grid 组件通过事件总线相互通信。

设置 Selenium Grid

先决条件

  1. 确保已下载 Java。 如果没有,请 下载 并设置将在其上运行 Grid 的机器上的 Java。
  2. Selenium 下载 页面下载最新的 jar。
  3. 确保 Web 驱动程序位于系统路径中。 有关更多详细信息,请参考 安装浏览器驱动程序。 服务器会自动检测路径上的驱动程序。 此行为是可配置的。

Selenium Grid 可以以三种模式中的任何一种设置:独立模式、集线器和节点模式以及完全分布式模式。

在所有三种模式中,默认服务器地址为 http://localhost:4444

独立模式

独立模式将所有 Grid 组件都集中在一个组件中。 这是开始使用 Grid 的最快方法。

java -jar selenium-server-${grid-version}>.jar standalone

集线器和节点

集线器包含路由器、分发器、新会话队列、会话映射和事件总线。 节点包含节点和事件总线,以允许与集线器通信。

启动集线器

java -jar selenium-server-${grid-version}.jar hub

启动节点

java -jar selenium-server-${grid-version}.jar node

完全分布式

在完全分布式模式下,每个 Grid 组件都独立运行。 所有 Grid 组件都依赖于事件总线来相互通信。

启动事件总线

java -jar selenium-server-${grid-version}.jar event-bus

启动会话映射

java -jar selenium-server-${grid-version}.jar sessions

启动新会话队列

java -jar selenium-server-${grid-version}.jar sessionqueue

启动分发器

java -jar selenium-server-${grid-version}.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false

启动路由器

java -jar selenium-server-${grid-version}.jar router --sessions http://localhost:5556 --distributor http://localhost:5553 --sessionqueue http://localhost:5559

启动节点

java -jar selenium-server-${grid-version}.jar node

要检查 Grid 是否已启动,请 ping http://<grid-url>/status 端点。

每个组件都有可配置的 CLI 选项

Docker

Selenium Grid 也支持 Docker。 请参考 Selenium Docker 开始使用。

Grid UI

导航到 http://<grid-url>/ui

Grid UI 显示 Grid 模型及其所有节点。 会话的单独选项卡会显示正在进行的会话和队列中等待的会话。

在 Selenium Grid 上运行 Nightwatch 测试

Nightwatch 附带几个 示例测试,您可以使用这些测试快速开始使用 Grid。

在本指南中,我们将假设使用的是 Nightwatch 2.0+。 您可以通过运行以下命令来安装它

npm i nightwatch

配置 Nightwatch 以使用 Grid

测试运行器需要一个配置文件。 该文件可以具有 ".json" 或 ".js" 的扩展名。 ".js" 比较受欢迎,因为它具有更多配置选项和功能。

如果不存在,Nightwatch 会承担繁重的工作,使用 ".js" 扩展名生成一个配置文件。 它包含一组不错的选项,可用于任何环境进行测试。 为简单起见,只需共享包含与 selenium-server 相关的选项的配置文件即可。 只需确保 selenium-server 主机和端口与 Grid URL 匹配,您就可以开始使用了。

{
  webdriver: {},

  test_settings: {
    selenium_server: {
      selenium: {
        start_process: false,
        host: 'localhost',
        port: 4444
      }
    },

    'selenium.chrome': {
      extends: 'selenium_server',
      desiredCapabilities: {
        browserName: 'chrome',
        chromeOptions : {
          w3c: true
        }
      }
    },

    'selenium.firefox': {
      extends: 'selenium_server',
      desiredCapabilities: {
        browserName: 'firefox'
      }
    }
  }
};

使用测试工作进程并行运行

默认情况下,test_workers 选项处于禁用状态。 如果应并行运行多个测试文件,请启用该选项。

要以并行模式运行,请确保 Grid 的 max-session CLI 选项设置为大于 1。 默认情况下,它基于机器上可用处理器的数量。

通过设置所需的测试工作进程数量来更新 Nightwatch 配置

{
  test_workers : {
    enabled: true,
    workers: 4
  }
}

请参考 配置部分,了解并使用配置选项。

针对 Selenium Grid 运行 Nightwatch

要使用 Chrome 针对 Selenium Grid 运行 Nightwatch

npx nightwatch examples/tests --env selenium.chrome

通过传递以逗号分隔的环境列表来在多个浏览器上运行测试

npx nightwatch examples/tests --env selenium.chrome,selenium.firefox

进一步阅读