• 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 最⼤的处理会话

    启动成功:

    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 运行的平台

    启动成功:

    3.查看 hub 运行状态

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

    从控制台看到已经注册了一个 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包放在同一个路径下:

    • 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使用详解

  • 相关阅读:
    Makefile学习
    Tmux使用
    Linux进程管理学习资料
    Linux内存管理学习资料
    Python常用的软件包
    Docker 学习
    Intel处理器技术文档
    Firefly-RK3399笔记
    Linux Kernel API
    ARM 技术文档
  • 原文地址:https://www.cnblogs.com/tester-ggf/p/12643624.html
Copyright © 2020-2023  润新知