带有并行测试的 TestNG 问题(Selenium Grid)?
TestNG issue(Selenium Grid) with Parallel tests?
我在 appium (Android) 中使用 Selenium 网格 运行 宁并行测试脚本时出现以下错误。
默认套件
总测试 运行:6,失败:0,跳过:3
配置失败:1,跳过:0
堆栈跟踪消息:
org.openqa.selenium.SessionNotCreatedException: 无法创建新会话。 (原始错误:请求了一个新会话,但一个正在进行中)
我的 TestNG xml 文件:
<suite name="Default suite" thread-count="4" parallel="tests">
<test name="Nexus">
<Parameters>
<parameter name="platform" value="Nexus"/>
<parameter name="browsername" value="Android"/>
<parameter name="remoteurl" value="http://0.0.0.0:4723/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes>
</test>
<test name="Moto E">
<Parameters>
<parameter name="platform" value="Moto E"/>
<parameter name="browsername" value="Android"/>
<parameter name="remoteurl" value="http://0.0.0.0:4726/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes></suite>
Config.Json 文件:
{
"capabilities":
[
{
"browserName":"Nexus",
"version":"5.1.1",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4723/wd/hub",
"host":"192.168.50.114",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4448,
"hubHost": "192.168.50.114"
}
}
硒节点的命令:
appium --nodeconfig path/to/json 文件。
测试脚本:
public class AppiumTest {
//静态RemoteWebDriver驱动程序;
@SuppressWarnings("rawtypes")
public static AndroidDriver driver;
@SuppressWarnings("rawtypes")
@org.testng.annotations.BeforeTest
public static void setUp() throws MalformedURLException{
DesiredCapabilities capabilities=new DesiredCapabilities();
capabilities.setCapability("deviceName","Nexus");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("appPackage","club.apptu.basic.callrecorder");
capabilities.setCapability("appActivity","MainActivity");
driver=new AndroidDriver(new URL("http://0.0.0.0:4723/wd/hub"),capabilities);
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}
@org.testng.annotations.Test
public void Test1(){
turnonoff();
turnonoff();
//longclick();
// important();
// delete();
// deleterecord();
// scroll();
// languagechange();
}
@org.testng.annotations.Test
public void Test2(){
drawer();
drawer();
}
@org.testng.annotations.Test
public void Test3(){
clickonitem();
play();
pause();
}
如有任何建议,我们将不胜感激。
我一直在使用 Selenium Grid 和 Appium,但遇到了同样的错误。当设备失去连接时它会突然出现,如果您使用的是真实设备,请尝试断开并重新连接 USB 并重新启动节点。
你可以运行
adb devices
如果列出了它们,您就不会收到该错误。
如需进一步帮助,请post测试脚本和JSON网格配置文件。
希望对您有所帮助。
所以我为相同目的使用的设置是:
TestNG.xml 2 台设备的文件:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="tests" thread-count="2">
<test name="Nexus 7">
<parameter name="udid" value="XXXX" />
<classes>
<class name="testNG.TestOne"/>
</classes>
</test> <!-- Test -->
<test name="HTC">
<parameter name="udid" value="XXXX" />
<classes>
<class name="testNG.TestOne"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
这里我传入的是每个设备的UDID,没必要传入其他任何东西,你传入的URL我认为是错误的,因为你应该将所有AndroidDrivers传递给Selenium Grid Hub URL 并使用 Hub 应将测试分配给正确设备的功能。
DriverSetup class 使用以下方法:
public static AndroidDriver getDriver(String udid) throws MalformedURLException{
String SELENIUM_HUB_URL = "XXXX";
ThreadLocal<AndroidDriver> driver = null;
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("device", udid);
capabilities.setCapability("deviceName", udid);
capabilities.setCapability("udid", udid);
capabilities.setPlatform(Platform.ANDROID);
capabilities.setCapability("browserName", "Chrome");
try {
driver = new ThreadLocal<AndroidDriver>();
driver.set(new AndroidDriver(new URL(SELENIUM_HUB_URL),
capabilities));
} catch (MalformedURLException e) {
System.out.println("Tackle Issue with RemoteDriverSetup");
}
driver.get().manage().timeouts()
.pageLoadTimeout(20L, TimeUnit.SECONDS);
driver.get().manage().timeouts()
.implicitlyWait(20L, TimeUnit.SECONDS);
return driver.get();
}
您需要更改功能以适应您的项目,但我建议使用 UDID 作为功能,因为这意味着测试 具有 到 运行某些设备。
通过在控制台中键入 adb devices
可以找到设备的 UDID。
您需要在初始化您的 AndroidDriver 时使用 Selenium Grid Hub URL,如果您绕过 Hub 并将测试直接发送到您丢失 Grid 的节点运行 并行测试的功能。
我的 TestOne 中的 BeforeClass 方法 class:
@Parameters({"udid"})
@BeforeClass
public void beforeClass(String udid) throws UnsupportedEncodingException, MalformedURLException, InterruptedException{
System.out.println("Run started for " + udid);
driver = DriverSetup.getDriver(udid);
}
JSON 配置文件
{
"capabilities":
[
{
"browserName": "Chrome",
"deviceName": "XXXX",
"device": "XXXX",
"udid":"XXXX",
"version":"4.2",
"maxInstances": 5,
"platform":"ANDROID",
"platformName": "Android"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":10000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4723/wd/hub",
"maxSession": 5,
"port": 4723,
"host": "0.0.0.0",
"register": true,
"registerCycle": 5000,
"hubPort": 4444,
"hubHost": "localhost"
}
}
希望这能帮助您解决问题。
我在 appium (Android) 中使用 Selenium 网格 运行 宁并行测试脚本时出现以下错误。
默认套件 总测试 运行:6,失败:0,跳过:3 配置失败:1,跳过:0
堆栈跟踪消息: org.openqa.selenium.SessionNotCreatedException: 无法创建新会话。 (原始错误:请求了一个新会话,但一个正在进行中) 我的 TestNG xml 文件:
<suite name="Default suite" thread-count="4" parallel="tests">
<test name="Nexus">
<Parameters>
<parameter name="platform" value="Nexus"/>
<parameter name="browsername" value="Android"/>
<parameter name="remoteurl" value="http://0.0.0.0:4723/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes>
</test>
<test name="Moto E">
<Parameters>
<parameter name="platform" value="Moto E"/>
<parameter name="browsername" value="Android"/>
<parameter name="remoteurl" value="http://0.0.0.0:4726/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes></suite>
Config.Json 文件:
{
"capabilities":
[
{
"browserName":"Nexus",
"version":"5.1.1",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4723/wd/hub",
"host":"192.168.50.114",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4448,
"hubHost": "192.168.50.114"
}
}
硒节点的命令: appium --nodeconfig path/to/json 文件。
测试脚本:
public class AppiumTest { //静态RemoteWebDriver驱动程序;
@SuppressWarnings("rawtypes")
public static AndroidDriver driver;
@SuppressWarnings("rawtypes")
@org.testng.annotations.BeforeTest
public static void setUp() throws MalformedURLException{
DesiredCapabilities capabilities=new DesiredCapabilities();
capabilities.setCapability("deviceName","Nexus");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("appPackage","club.apptu.basic.callrecorder");
capabilities.setCapability("appActivity","MainActivity");
driver=new AndroidDriver(new URL("http://0.0.0.0:4723/wd/hub"),capabilities);
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}
@org.testng.annotations.Test
public void Test1(){
turnonoff();
turnonoff();
//longclick();
// important();
// delete();
// deleterecord();
// scroll();
// languagechange();
}
@org.testng.annotations.Test
public void Test2(){
drawer();
drawer();
}
@org.testng.annotations.Test
public void Test3(){
clickonitem();
play();
pause();
}
如有任何建议,我们将不胜感激。
我一直在使用 Selenium Grid 和 Appium,但遇到了同样的错误。当设备失去连接时它会突然出现,如果您使用的是真实设备,请尝试断开并重新连接 USB 并重新启动节点。
你可以运行
adb devices
如果列出了它们,您就不会收到该错误。
如需进一步帮助,请post测试脚本和JSON网格配置文件。
希望对您有所帮助。
所以我为相同目的使用的设置是:
TestNG.xml 2 台设备的文件:
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="tests" thread-count="2"> <test name="Nexus 7"> <parameter name="udid" value="XXXX" /> <classes> <class name="testNG.TestOne"/> </classes> </test> <!-- Test --> <test name="HTC"> <parameter name="udid" value="XXXX" /> <classes> <class name="testNG.TestOne"/> </classes> </test> <!-- Test --> </suite> <!-- Suite -->
这里我传入的是每个设备的UDID,没必要传入其他任何东西,你传入的URL我认为是错误的,因为你应该将所有AndroidDrivers传递给Selenium Grid Hub URL 并使用 Hub 应将测试分配给正确设备的功能。
DriverSetup class 使用以下方法:
public static AndroidDriver getDriver(String udid) throws MalformedURLException{ String SELENIUM_HUB_URL = "XXXX"; ThreadLocal<AndroidDriver> driver = null; DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("device", udid); capabilities.setCapability("deviceName", udid); capabilities.setCapability("udid", udid); capabilities.setPlatform(Platform.ANDROID); capabilities.setCapability("browserName", "Chrome"); try { driver = new ThreadLocal<AndroidDriver>(); driver.set(new AndroidDriver(new URL(SELENIUM_HUB_URL), capabilities)); } catch (MalformedURLException e) { System.out.println("Tackle Issue with RemoteDriverSetup"); } driver.get().manage().timeouts() .pageLoadTimeout(20L, TimeUnit.SECONDS); driver.get().manage().timeouts() .implicitlyWait(20L, TimeUnit.SECONDS); return driver.get(); }
您需要更改功能以适应您的项目,但我建议使用 UDID 作为功能,因为这意味着测试 具有 到 运行某些设备。
通过在控制台中键入 adb devices
可以找到设备的 UDID。
您需要在初始化您的 AndroidDriver 时使用 Selenium Grid Hub URL,如果您绕过 Hub 并将测试直接发送到您丢失 Grid 的节点运行 并行测试的功能。
我的 TestOne 中的 BeforeClass 方法 class:
@Parameters({"udid"}) @BeforeClass public void beforeClass(String udid) throws UnsupportedEncodingException, MalformedURLException, InterruptedException{ System.out.println("Run started for " + udid); driver = DriverSetup.getDriver(udid); }
JSON 配置文件
{ "capabilities": [ { "browserName": "Chrome", "deviceName": "XXXX", "device": "XXXX", "udid":"XXXX", "version":"4.2", "maxInstances": 5, "platform":"ANDROID", "platformName": "Android" } ], "configuration": { "cleanUpCycle":2000, "timeout":10000, "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "url":"http://0.0.0.0:4723/wd/hub", "maxSession": 5, "port": 4723, "host": "0.0.0.0", "register": true, "registerCycle": 5000, "hubPort": 4444, "hubHost": "localhost" } }
希望这能帮助您解决问题。