Selenium Grid 的使用

简介

Selenium Grid 是 selenium 的三大组件之一,允许用户同时在不同的机器和系统上测试不同的浏览器,可以分布式的来执行我们的自动化测试,也可以测试不同浏览器的兼容性。

Selenium Grid 的组成:

  • hub节点(控制器)
    • 中心节点,控制节点。
    • 管理各个 node 节点的注册信息和状态。
    • 接受并转发客户端(测试脚本)请求到合适的 node 节点。
  • node 节点(执行器)
    • 子节点,代理点。
    • 负责注册配置信息到 hub 节点(平台,浏览器,浏览器版本)
    • 负责接收来自 hub 节点转发的请求以执行具体用例。
    • 也可单独作为远程节点执行测试用例。

环境准备

  • 在需要执行脚本的机器上安装 jdk 和配置环境变量。
  • 然后下载 selenium-server-standalone-x.x.x.jar, 版本对应自己使用selenium 的版本。

Selenium Grid 运行

1.启动 hub 节点

java -jar selenium-server-standalone-3.12.0.jar -role hub -port 18888 -maxSession 10

参数解释:

  • java -jar selenium-server-standalone-3.12.0.jar 运⾏jar包
  • -role hub 以 hub 的⻆⾊运⾏
  • -port 8888 指定hub运⾏的端⼝(默认为4444)
  • -maxSession 10 最⼤的处理会话

启动成功:

Selenium Grid 的使用

2.启动 node 节点

启动 chrome 浏览器:

java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.12.0.jar
-role node -hub " http://192.168.1.104:18888/grid/register/" -port 18881 -browser
"browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"

参数解释:

  • -Dwebdriver.chrome.driver="chromedriver.exe" 指定 chromeDriver 驱动所在的路径(本地)
  • -jar selenium-server-standalone-3.12.0.jar 执行jar包
  • -role node 以 node 角色执行。
  • -hub " http://192.168.1.104:18888/grid/register/" 将node 节点信息,注册到 对应的 hub 节点上。
  • -port 18881 node节点使用的端口。
  • -browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
    • browserName=chrome 运行的浏览器。
    • maxInstances=2 最多支持两个浏览器示例。
    • version=75 浏览器版本号。
    • platform=WINDOWS 运行的平台

启动成功:

Selenium Grid 的使用

3.查看 hub 运行状态

通过地址:http://localhost:18888/grid/console

Selenium Grid 的使用

从控制台看到已经注册了一个 node 节点,使用的是 chrome 浏览器。

4.执行脚本

Selenium Grid 运行环境启动之后,我们通过对应的脚本来进行使用。

package com.ggf.webauto;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

import java.net.URL;

/**
 * @Description:
 * @Author: ggf
 * @Date: 2020/04/06
 */
public class RemoteDemo {
    public static void main(String[] args) throws Exception {
        // 期望能力对象
        DesiredCapabilities capabilities = new DesiredCapabilities();
        //配置测试的浏览器,使用chrome浏览器
        capabilities.setBrowserName(BrowserType.CHROME);
        // hub节点
        String url = "http://192.168.1.104:18888/wd/hub";
        //和hub建立通讯,把相应配置传给hub,hub会根据配置选择注册的node节点,打开相应的浏览器进行测试
        WebDriver driver = new RemoteWebDriver(new URL(url), capabilities);
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("selenium");
        Thread.sleep(2000);
        driver.quit();
    }
}

运行脚本之后,Selenium Grid 的 hub节点就会调用对应的 node 节点来执行我们脚本中的内容。

5. Selenium Grid 启动优化

为了方便我们快速的启动 Selenium Grid , 我们可以将启动 hub 节点和 node 节点的命令写成一个 .bat 文件(windows系统) 或 shell 脚本(Linux系统)

以下是window系统的示例:

  • 将 bat文件和浏览器驱动以及selenium-server的jar包放在同一个路径下:

Selenium Grid 的使用

  • hub.bat
java -jar selenium-server-standalone-3.12.0.jar -role hub -port 18888 -maxSession 10
  • node.bat
set command=java
set chromeDriver=-Dwebdriver.chrome.driver="chromedriver.exe"
set jarParams=-jar selenium-server-standalone-3.12.0.jar
set type=-role node
set hub=-hub "http://192.168.1.104:18888/grid/register"
set port=-port 18881
set chrome=-browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
%command% %chromeDriver% %jarParams% %type% %hub% %port% %chrome%

Selenium Grid + TestNG多线程执行

Selenium Grid能够分布式在不同机器上运⾏不同浏览器,但是我们看到的串⾏的效果(也就是⼀个浏览器执⾏结束后,再运⾏另外⼀个浏览器)。要达到并发执⾏的效果,Selenium Grid是做不到的,我们需要通过TestNG单元测试框架所带的并发执⾏机制。并发执⾏能够带来的好处:

  • 减少了执⾏时间:并⾏测试也就意味着多个浏览器可以在同⼀时间被同时执⾏,从⽽减少了整体测试所花费的时间
  • 允许多个线程并⾏同时执⾏⼀个测试脚本/不同的测试脚本

java运行脚本:

package com.ggf.webauto;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.Test;

import java.net.URL;

/**
 * @Description:
 * @Author: ggf
 * @Date: 2020/04/06
 */
public class SeleniumGridDemo {
    @Test
    public void testBaiduSearch() throws Exception{
        // 期望能力对象
        DesiredCapabilities capabilities = new DesiredCapabilities();
        //配置测试的浏览器,使用chrome浏览器
        capabilities.setBrowserName(BrowserType.CHROME);
        // hub节点
        String url = "http://192.168.1.104:18888/wd/hub";
        //和hub建立通讯,把相应配置传给hub,hub会根据配置选择注册的node节点,打开相应的浏览器进行测试
        WebDriver driver = new RemoteWebDriver(new URL(url), capabilities);
        driver.get("http://www.baidu.com");
        driver.findElement(By.id("kw")).sendKeys("selenium");
        Thread.sleep(2000);
        driver.quit();
    }
}

xml文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite" parallel="tests" thread-count="2">
    <test name="Test1">
        <classes>
            <class name="com.ggf.webauto.SeleniumGridDemo" />
        </classes>
    </test>
    <test name="Test2">
        <classes>
            <class name="com.ggf.webauto.SeleniumGridDemo" />
        </classes>
    </test>
</suite>

解释:
parallel="tests"

tests级别:不同的test tag下的用例可以在不同的线程下执行。

相同的test tag下的用例只能在同一个线程中去执行。

thread-count=2:代表了最大并发线程数.

以上xml配置表示:启动两个线程同时执行 SeleniumGridDemo 类。

testng多线程更多内容可参考文章: testng使用详解

上一篇:57、尚硅谷_SpringBoot_Docker-docker镜像操作常用命令


下一篇:集线器(Hub)、交换机(SW)、路由器(router)对比区别