• Selenium Grid:在多个主机上并行执行自动化脚本


    Selenium Grid是selenium提供的一个分布式测试工具,将自动化脚本发布到多个物理机或者虚拟机(跨平台、跨浏览器)上执行,通过一个中心节点来控制多个设备,也就是在中心节点(hub)上运行测试,在其它节点(node)上执行,实现selenium的并行执行。除了可以在多个设备上运行测试脚本以外,也可以实现多浏览器兼容性测试。它本身不提供多线程并发执行,需要结合多进程技术实现并行执行用例。

    Selenium Grid架构

    Selenium Grid由hub节点和若干个node代理节点组成

    https://www.selenium.dev/docs/site/en/grid/components_of_a_grid/

    hub作为管理节点,用来管理各个代理节点的注册和状态信息,并且接收远程客户端代码请求调用,然后把请求的命令再转发给代理代点来执行。每个Selenium Grid仅包含一个hub,hub连接多个节点(node),node就是浏览器所在的位置,注册到hub,接收hub的请求并执行测试。

    Selenium Grid使用

    注意hub主机和远程主机需要安装java环境和selenium框架。

    1. 下载

    下载Selenium Server,下载地址:https://www.selenium.dev/downloads/

    2. 启动hub

    windows打开命令终端,输入如下命令:

    $ java -jar selenium-server-standalone-3.141.59.jar -role hub
    21:07:10.738 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358
    21:07:10.844 INFO [GridLauncherV3.lambda$buildLaunchers$5] - Launching Selenium Grid hub on port 4444
    2021-04-06 21:07:11.265:INFO::main: Logging initialized @987ms to org.seleniumhq.jetty9.util.log.StdErrLog
    21:07:12.104 INFO [Hub.start] - Selenium Grid hub is up and running
    21:07:12.108 INFO [Hub.start] - Nodes should register to http://192.168.2.103:4444/grid/register/
    21:07:12.108 INFO [Hub.start] - Clients should connect to http://192.168.2.103:4444/wd/hub
    

    默认情况下,启动4444端口,可以使用-port设置启动端口。

    也可以浏览器打开http://localhost:4444/grid/console, 查看hub是否启动成功:

    根据打印的日志可以看到主机的IP地址为192.168.2.103,node需要注册到地址http://192.168.2.103:4444/grid/register/

    3. 启动node

    先编写配置文件chrome_node.json,参考https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json

    {
      "capabilities":
      [
        {
          "browserName": "chrome",
          "maxInstances": 5,
          "seleniumProtocol": "WebDriver"
        }
    
      ],
      "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
      "maxSession": 5,
      "port": -1,
      "register": true,
      "registerCycle": 5000,
      "hub": "http://localhost:4444",
      "nodeStatusCheckTimeout": 5000,
      "nodePolling": 5000,
      "role": "node",
      "unregisterIfStillDownAfter": 60000,
      "downPollingLimit": 2,
      "debug": false,
      "servlets" : [],
      "withoutServlets": [],
      "custom": {}
    }
    

    配置文件firefox_node.json

    {
      "capabilities":
      [
        {
          "browserName": "firefox",
          "maxInstances": 5,
          "seleniumProtocol": "WebDriver"
        }
    
      ],
      "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
      "maxSession": 5,
      "port": -1,
      "register": true,
      "registerCycle": 5000,
      "hub": "http://localhost:4444",
      "nodeStatusCheckTimeout": 5000,
      "nodePolling": 5000,
      "role": "node",
      "unregisterIfStillDownAfter": 60000,
      "downPollingLimit": 2,
      "debug": false,
      "servlets" : [],
      "withoutServlets": [],
      "custom": {}
    }
    

    在本机启动一个node,将节点注册到http://192.168.2.103:4444/grid/register ,新打开一个命令终端,启动chrome节点,输入如下命令:

    $ java -Dwebdriver.chrome.driver=D:\testing_tools\chromedriver89\chromedriver.exe -jar selenium-server-standalone-3.141.59.jar -role node -nodeConfig chrome_node.json
    

    启动一个firefox节点:

    $ java -Dwebdriver.gecko.driver=D:\testing_tools\firefoxdriver\geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role node -nodeConfig firefox_node.json
    

    也可以其它设备上(比如虚拟机,注意hub主机与远程node主机之间可以相互ping通)上启动一个node:

    $ java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.2.103:4444/grid/register
    

    刷新浏览器:http://localhost:4444/grid/console

    发现三个节点注册成功!

    4. 编写示例脚本

    from selenium.webdriver import Remote
    from selenium.webdriver import DesiredCapabilities
    
    @pytest.mark.parametrize("node", ["firefox","chrome"])
    def test_grid(self,node):
        if node == "firefox":
            capability = DesiredCapabilities.FIREFOX.copy()
        elif node == "chrome":
            capability = DesiredCapabilities.CHROME.copy()
    
        self.driver = Remote(command_executor="http://localhost:4444/wd/hub",
                        desired_capabilities=capability)
        self.driver.get("https://www.baidu.com/")
    

    采用多线程分布并行执行

    import threading
    
    def test_parallel(self):
        node_list = ["firefox","chrome"]
        thread_list = []
        for browser in node_list:
            t = threading.Thread(target=self.test_grid, args=(browser,))
            thread_list.append(t)
    
        for t in thread_list:
            t.start()
    
        for t in thread_list:
            t.join()
    
    

    参考资料

    1. https://www.selenium.dev/docs/site/en/grid/
    2. https://github.com/SeleniumHQ/selenium
    3. https://github.com/SeleniumHQ/selenium/wiki/Grid2
    --THE END--

    欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

  • 相关阅读:
    文件同步
    Renesas PPP Mode
    PYTHON 常用API ***
    Python DB
    Python VIL Realse
    C BIN加密
    Python VIL Service Bin
    Python 定期检查Build_setting的编译情况
    Python 字串处理
    IP分片(IP Fragment)
  • 原文地址:https://www.cnblogs.com/hiyong/p/14640140.html
Copyright © 2020-2023  润新知