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