java - 如何在 Selenium Grid 中执行 50/50 并行测试

原文 标签 java selenium automation grid

我有一个 selenium Grid 3 设置。
现在我有 1 个集线器 + 2 个节点。 (1个本地节点,1个外部节点)。
当我运行我的测试时,它会在本地节点上执行它(打开 3 个浏览器)。

我应该如何以及在哪里设置测试执行?如果我想在 2 个浏览器上运行所有测试,或者如果我想在 2 个浏览器上运行 50/50 测试?
我将在下面附上我现有的代码。

package com.ParallelTest;


        import org.openqa.selenium.chrome.ChromeDriver;
        import org.testng.annotations.BeforeClass;
        import org.testng.annotations.Parameters;

        import java.io.File;
        import java.net.MalformedURLException;
        import java.net.URL;
        import java.util.concurrent.TimeUnit;

        import org.openqa.selenium.Platform;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.remote.DesiredCapabilities;
        import org.openqa.selenium.remote.RemoteWebDriver;
        import org.testng.annotations.AfterClass;

public class Framework {
    protected WebDriver driver;

    @Parameters({ "platform","browser","version", "url" })
    @BeforeClass(alwaysRun=true)
    public void setup(String platform, String browser, String
            version, String url) throws MalformedURLException
    {
        driver = getDriverInstance(platform, browser, version, url);

    }

    public static WebDriver getDriverInstance(String platform, String browser, String version, String url)
            throws MalformedURLException {
        String nodeURL = null;

*// IS this should be a Node or Hub path? Because right now it`s a node path. But if i want to use 2 different nodes? How i can implement it????*
        String nodeURL = "http://10.11.161.249:5555/wd/hub";
        WebDriver driver = null;
        DesiredCapabilities caps = new DesiredCapabilities();

        // Platforms
        if (platform.equalsIgnoreCase("Windows")) {
            caps.setPlatform(Platform.WINDOWS);


        }
        if (platform.equalsIgnoreCase("MAC")) {
            caps.setPlatform(Platform.MAC);

        }
        // Browsers
        if (browser.equalsIgnoreCase("chrome")) {
            caps = DesiredCapabilities.chrome();
            System.setProperty("webdriver.chrome.driver", "/Users/antonfiliptsov/Desktop/Grid/ChromeDriver/chromedriver");
        }
        if (browser.equalsIgnoreCase("firefox")) {
            caps = DesiredCapabilities.firefox();
            System.setProperty("webdriver.gecko.driver","/Users/antonfiliptsov/Desktop/Grid/Firefox/geckodriver");

        }
        if (browser.equalsIgnoreCase("safari")){
            caps = DesiredCapabilities.safari();
        }

        // Version
        caps.setVersion(version);
        driver = new RemoteWebDriver(new URL(nodeURL), caps);
        // Maximize the browser's window
        // driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // Open the Application
        driver.get(url);
        return driver;
    }

    @AfterClass
    public void afterClass() {
        driver.quit();
    }
}

这是我的 TestNG 文件
<suite name="TestSuite" parallel="tests">
    <test name="FireFox Test">
        <parameters>
            <parameter name="platform" value="MAC" />
            <parameter name="browser" value="firefox" />
            <parameter name="version" value="50.1.0" />
            <parameter name="url" value="https://google.com" />
        </parameters>
        <classes>
            <class name="com.test">
            </class>
        </classes>
    </test>
    <test name="Chrome Test">
        <parameters>
            <parameter name="platform" value="MAC" />
            <parameter name="browser" value="chrome" />
            <parameter name="version" value="55.0.2883.87" />
            <parameter name="url" value="https://google.com" />
        </parameters>
        <classes>
            <class name="com.test">
            </class>
        </classes>
    </test>
<test name="Chrome Test 1">
<parameters>
    <parameter name="platform" value="MAC" />
    <parameter name="browser" value="chrome" />
    <parameter name="version" value="55.0.2883.87" />
    <parameter name="url" value="https://google.com" />
</parameters>
<classes>
    <class name="com.test">
    </class>
</classes>
</test>

</suite>

在我的测试中,我有 字符串 nodeURL = "http://10.11.161.249:5555/wd/hub";
哪个指向我对特定节点的测试,但我如何设置指向不同节点的测试,或在 2 个节点上并行运行?

最佳答案

网格旨在执行以下角色:

  • 给定所需的功能(测试根据浏览器风格/版本/平台组合提出的要求),网格负责遍历已注册节点的列表,并将其与实际功能匹配。
  • 将多余的请求保存在队列中,然后在节点空闲时(当所有节点都忙时)将请求委托(delegate)给节点

  • 因此,您应该将测试指向仅针对 HUB URL 而不是针对节点 URL 运行。网格将负责根据能力匹配将测试分发到节点。

    错误

    org.openqa.selenium.WebDriverException: Error forwarding the new session cannot find : Capabilities [{browserName=firefox, version=55.0.2883.87, platform=ANY}]



    基本上是网格告诉你的方式,你要求 firefox版本为 55.0.2883.87 的浏览器风格在任何平台上运行,但网格没有任何注册到它的具有此功能的节点。

    这是正确的,因为您的节点配置 JSON 没有指定 firefox 的版本。
    {
        "capabilities": [
            {
                "browserName": "firefox",
                "maxInstances": 5,
                "seleniumProtocol": "WebDriver"
            },
            {
                "browserName": "chrome",
                "maxInstances": 5,
                "seleniumProtocol": "WebDriver"
            },
            {
                "browserName": "safari",
                "maxInstances": 1,
                "seleniumProtocol": "WebDriver"
            }
        ],
        "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
        "maxSession": 5,
        "port": 5555,
        "register": true,
        "registerCycle": 5000,
        "hub": "http://192.168.1.115:4444",
        "nodeStatusCheckTimeout": 5000,
        "nodePolling": 5000,
        "role": "node",
        "unregisterIfStillDownAfter": 60000,
        "downPollingLimit": 2,
        "debug": false,
        "servlets": [
    
        ],
        "withoutServlets": [
    
        ],
        "custom": {
        }
    }
    

    要解决此问题,要么
  • 请删除 caps.setVersion(version); 行来自您的setup()方法(或)
  • 增强您的节点配置 JSON 文件以包含 Firefox 的版本号。

  • 合并我的回答作为答案。

    关于java - 如何在 Selenium Grid 中执行 50/50 并行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577184/

    相关文章:

    java - Android - 按计划运行提示

    java - Ruby 与严格的页面对象模式兼容吗?

    Java 安全的 String.format 和转义 %

    java - DateFormat.parse(String) 如何处理非日期尾随文本?

    javascript - 使用 Selenium + JavaScript 或 WebDriverJS 在浏览器中执行 JavaScript

    python - 如何在Python中使用Selenium抓取动态生成的多个div

    python - 如何在 Python 中使用 Selenium 打开 Chrome 开发者控制台?

    java - 使用 TestNG 管理数千个测试脚本

    java - 如何使用 appium 的坐标滚动

    java - Spring Boot RESTful 服务作为 WAR 而不是 JAR