Selenium 简明教程

Selenium Grid - Create Test Script

Selenium Grid 由六个组件组成,即路由器、分配器、节点、会话队列、会话映射和事件总线,这使得能够以多种方式部署它。根据要求,我们可以在分布式模式下单独启动 Selenium Grid 的各个组件,将它们在中心和节点模式下隔离为中心和节点,并在独立模式下一次启动所有组件。

Standalone Mode in Selenium Grid

在独立模式下,Selenium Grid 的每个组件作为一个单元工作,并且可以使用单个命令通过单个进程触发。这是运行 Selenium Grid 的最便捷方式。服务器连接到 http://localhost:4444 上的 RemoteWebdriver 请求,并自动从系统路径中找到所有驱动程序。在独立模式下触发 Selenium Grid 后,所有测试都应使用 http://localhost:4444

Benefits of Standalone Mode in Selenium Grid

Selenium Grid 中独立模式的好处如下:

  1. 创建和排除使用 RemoteWebdriver 本地构建的测试中的故障。

  2. 在推送代码之前快速执行单元测试。

  3. 可以轻松地使用 CI/CD 工具配置。

Hub and Node Mode in Selenium Grid

在 Selenium Grid 中,中心包括路由器、会话映射、会话队列和事件总线等组件。服务器自动连接到 http://localhost:4444 上的 RemoteWebdriver 请求。

该节点在起点期间从系统路径找到所有驱动程序。多个节点可以在同一台机器上执行。例如,如果有两个节点 A 和 B 在同一台机器上运行,则使用以下命令:

For Node A,

java -jar selenium-server-<version>.jar node --port 5555

For Node B,

java -jar selenium-server-<version>.jar node --port 6666

中心和节点可以定位在不同的机器上,它们通过 HTTP 和事件总线进行通信。该节点使用事件总线向中心发送消息进行注册。中心收到消息后,会使用 HTTP 扩展到节点以检查其是否存在。

要正确地将节点注册到中心,事件总线端口(默认端口:4442 和 4443)需要在中心计算机和节点上可用。这有助于建立中心和节点之间的连接。如果中心正在使用默认端口,则可以使用 --hub 标志来注册节点,如以下命令所示。

java -jar selenium-server-<version>.jar node --hub http://<hub-ip>:4444

如果中心没有使用默认端口,则使用标志 --publish-events 和 --subscribe-events,如下面的命令所示。

java -jar selenium-server-<version>.jar hub
   --publish-events tcp://<hub-ip>:8886
   --subscribe-events tcp://<hub-ip>:8887 --port 8888

在上例中,中心正在使用端口 8886、8887 和 8888。在注册中心后,节点将使用相同的端口进行成功注册,使用与中心相同的端口,如下面命令所示。

java -jar selenium-server-<version>.jar node
   --publish-events tcp://<hub-ip>:8886
   --subscribe-events tcp://<hub-ip>:8887

Benefits of Hub and Node mode in Selenium Grid

在 Selenium Grid 中,已观察到中心和节点模式是最常用的模式。Selenium Grid 中中心和节点模式的优势如下:

  1. 中心和节点模式允许在 Selenium Grid 中集成具有不同平台、浏览器及其版本的各种计算机。

  2. 中心和节点模式通过指向一个条目来运行,以在各种环境中执行 WebDriver 测试。

  3. 测试可以轻松地扩展或缩小,而不会影响整个网格。

Distributed Mode in Selenium Grid

在分布式模式下,Selenium Grid 的每个组件都应理想地位于不同的计算机上,并且它们需要分别启动。必须正确使用每个端口才能使所有组件之间正确交互。

从事件总线开始允许网格组件之间的通信。事件总线的默认端口为 4442、4443 和 5557。

java -jar selenium-server-<version>.jar event-bus
   --publish-events tcp://<event-bus-ip>:4442 --subscribe-events
   tcp://<event-bus-ip>:4443 --port 5557

然后,新会话队列将新会话附加到队列中,该队列将由分发器获取。新会话队列的默认端口为 5559。

java -jar selenium-server-<version>.jar sessionqueue --port 5559

会话图将会话 ID 连接到会话正在执行的节点,并与事件总线通信。新会话队列的默认端口为 5556。

java -jar selenium-server-<version>.jar sessions
   --publish-events tcp://<event-bus-ip>:4442
   --subscribe-events tcp://<event-bus-ip>:4443 --port 5556

分发器获取新会话队列以进行新会话请求到节点,前提是它们的功能类似。节点以类似于在中心和节点模式下注册节点的方式注册到分发器。分发器的默认端口为 5553。分发器与新会话队列、会话图、事件总线和节点进行通信。

java -jar selenium-server-<version>.jar distributor
   --publish-events tcp://<event-bus-ip>:4442 --subscribe-events
   tcp://<event-bus-ip>:4443 --sessions
   http://<sessions-ip>:5556 --sessionqueue
   http://<new-session-queue-ip>:5559 --port 5553 --bind-bus false

路由器将新会话请求更改为队列,并将正在运行的会话请求转发到正在运行会话的节点。路由器的默认端口为 4444。路由器与新会话队列、会话图和分发器进行通信。

java -jar selenium-server-<version>.jar router --sessions
   http://<sessions-ip>:5556 --distributor
   http://<distributor-ip>:5553 --sessionqueue
   http://<new-session-queue-ip>:5559 --port 4444

节点的默认端口为 5555。

java -jar selenium-server-<version>.jar node
   --publish-events tcp://<event-bus-ip>:4442
   --subscribe-events tcp://<event-bus-ip>:4443

Benefits of Distributed Mode in Selenium Grid

Selenium Grid 的分布式模式用于在大型网格中需要设置大量节点时(只有一个中心和跨多台计算机的许多节点)。在这种情况下,中心和节点模式不是理想的选择。

Prerequisites to Create a Test Script

Step 1 − 在系统中安装 Java(版本高于 8),并使用以下命令检查它是否存在:java -version。如果安装成功完成,将显示已安装的 java 版本。

Step 2 − 通过打开浏览器并输入来检查网格状态 −

  1. 对于 UI 版本,键入 http://localhost:4444

  2. 对于非 UI 版本,键入 http://localhost:4444/status

对于这两种情况,我们都会收到错误 - 无法使用此网站。因为 Selenium Grid 尚未启动。

selenium grid create test script 1

Create a Test Script in Selenium Grid

在独立模式下创建测试脚本的步骤如下:

Step 1 - 从下面的链接下载 Selenium Standalone Jar 并将其保存在文件夹中 -

Step 2 - 从已存储 Selenium Standalone Jar 的文件夹位置,从终端运行以下命令 -

java -jar selenium-server-<version>.jar standalone.

Step 3 - 再次通过打开浏览器并输入: http://localhost:4444 检查网格状态。

The Error - 将不再有“此网站无法访问”的显示,并且我们会获得显示不同浏览器的 Grid 状态。这将证明 Selenium Grid 已在 Standalone 模式下触发。

selenium grid create test script 2

Step 4 -

Base.java 中实现代码

package BaseClass;

import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Base {
   public WebDriver setBrowser(String browserName) throws MalformedURLException {
      WebDriver driver = null;
      DesiredCapabilities dc = new DesiredCapabilities();

      if(browserName.equalsIgnoreCase("chrome")) {
         dc.setBrowserName("chrome");
      } else if(browserName.equalsIgnoreCase("edge")) {
         dc.setBrowserName("MicrosoftEdge");
      }

      // Initiate RemoteWebDriver
      driver = new RemoteWebDriver(new URL("http://localhost:4444"),dc);
      return driver;
   }
}

TestOne.java 中实现代码

package Grid;

import BaseClass.Base;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.net.MalformedURLException;

public class TestOne extends Base {
   public WebDriver driver = null;
   @Test
   public void testOne() {

      // launch application
      driver.get("https://www.tutorialspoint.com/selenium/practice/links.php");

      // get page title
      System.out.println("Page title is: " + driver.getTitle() + " obtained from testOne");
   }

   @BeforeMethod
   public void setup() throws MalformedURLException {
      driver = setBrowser("chrome");
   }

   @AfterMethod
   public void tearDown() {

      // quitting browser
      driver.quit();
   }
}

TestTwo.java 中的代码实现

package Grid;

import BaseClass.Base;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.net.MalformedURLException;

public class TestTwo extends Base {
   public WebDriver driver = null;
   @Test
   public void testTwo() {

      // launch application
      driver.get("https://www.tutorialspoint.com/selenium/practice/links.php");

      // get page title
      System.out.println("Page title is: " + driver.getTitle() + " obtained from testTwo");
   }
   @BeforeMethod
   public void setup() throws MalformedURLException {
      driver = setBrowser("edge");
   }
   @AfterMethod
   public void tearDown() {

      // quitting browser
      driver.quit();
   }
}

testng.xml 文件中的配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "Grid Test">
   <test thread-count = "5" name="Test">
      <classes>
         <class name="Grid.TestOne" />
         <class name="Grid.TestTwo"/>
      </classes>
   </test>
</suite>

Step 5 - 从 testng.xml 文件中运行测试。

它将显示以下内容 output

Page title is: Selenium Practice - Links obtained from testOne
Page title is: Selenium Practice - Links obtained from testTwo

===============================================
Grid Test
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================

Process finished with exit code 0

在上面的示例中,我们已经配置了 Selenium Grid 的 Standalone 模式。

这结束了我们对 Selenium Grid - 创建测试脚本教程的全面介绍。我们从描述 Selenium Grid 中的独立、中心和节点以及分布式模式及其优点、创建测试脚本的先决条件以及如何在 Selenium Grid 中创建测试脚本开始。

这使您对 Selenium Grid - 创建测试脚本有了深入的了解。明智的做法是继续实践你所学到的知识并探索与硒相关的其他知识,以加深你的理解并扩展你的视野。