网格在测试 运行 期间不符合 "Platform" 要求

Grid does not follow "Platform" requirements during test run

我在 2 个不同节点上的 selenium 网格中有 2 个测试。其中一个节点运行宁MAC,另一个节点WIN.

当我在 TestNG 运行 中指定两个测试 (例如,我想启动 Win Chrome 仅测试和 MAC FF 仅测试。)

它随机启动它们,有时 mac 会再次获得 FF chrome,或者如果 win 关闭,它会在 mac.

上启动两个测试

当我在测试中指定时

<parameter name="platform" value="WINDOWS" />

它可以在 mac 上启动此测试,反之亦然。

这是我的 TestNG 文件:

<suite name="TestSuite" parallel="tests">


    <test name="win chrome test">
        <parameters>
            <parameter name="platform" value="WINDOWS" />
            <parameter name="browser" value="chrome" />
            <parameter name="version" value="55.0" />
            <parameter name="url" value="https://google.com" />
        </parameters>
        <classes>
            <class name="com.ParallelTest.CreateRandomProfileTest"/>
            <class name="com.ParallelTest.LogInTest">

            </class>
        </classes>
    </test>


    <test name="mac 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.ParallelTest.CreateRandomProfileTest"/>
            <class name="com.ParallelTest.LogInTest">

            </class>
        </classes>
    </test>



</suite> 

这是我的网格设置文件:

package com.parallelSetUp;


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;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;

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

public class Framework{
    String browser;
    protected WebDriver driver;

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

    }

    public static WebDriver getDriverInstance(String platform, String browser, String version, String url)
            throws MalformedURLException {
        String nodeURL = "http://192.168.1.115:4444/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);
        }
        if (platform.equalsIgnoreCase("ANDROID")) {
            caps.setPlatform(Platform.ANDROID);
        }

        // Browsers
        if (browser.equalsIgnoreCase("chrome")) {
            caps = DesiredCapabilities.chrome();
            //System.setProperty("webdriver.chrome.driver", "/Users/antonfiliptsov/Desktop/Grid/Chrome/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();
    }
}

这是我的 Node.json

{
  "capabilities":
  [
    {
      "browserName": "firefox",
      "maxInstances": 5,
      "version": "50.1.0",
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "version": "55.0",
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "safari",
      "maxInstances": 1,
      "version": "10.0.2",
      "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": {}
}

首先,你应该确定你的节点在你启动它们并连接到集线器后有哪些能力,在集线器机器上的 http://localhost:{port}/grid/console 上看到这个。在节点匹配中考虑的能力是 PLATFORM, BROWSER_NAME, VERSION, BROWSER_VERSIONAPPLICATION_NAME.

在那之后你可以确定你的网格节点是如何匹配的,如果它不能满足你的需要你可以扩展 DefaultCapabilityMatcher class 并添加你自己的匹配器(我做了几个星期之前,添加了我的自定义参数以确保它的行为符合我的要求)。 如果您决定扩展默认匹配器,This link 将是一个好的开始。