当我使用Selenium网格在appium(Android)中运行并行测试脚本时,我得到以下错误。
默认套件运行得测试总数: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"
}
}
selenium节点的命令:appium--nodeconfig path/to/json文件。
测试脚本:
公共类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();
}
如有任何建议,将不胜感激。
因此,我使用的相同目的的设置是:
>
用于2个设备的testng.xml文件:
<?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网格集线器URL,并使用集线器应该将测试分配给正确的设备的功能。
>
使用以下方法的Driversetup类:
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网格集线器URL,如果绕过集线器并将测试直接发送到节点,就会失去网格并行运行测试的功能。
>
我的TestOne类中的BeforeClass方法:
@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"
}
}
我希望这能帮你解决问题。
我一直在用Selenium网格和Appium工作,也遇到过同样的错误。当设备失去连接时,它就会出现,如果您使用的是真正的设备,请尝试断开和重新连接USB并重新启动节点。
你可以跑
adb devices
如果它们被列出,你就不会得到那个错误。
要获得更多帮助,请发布网格的测试脚本和JSON配置文件。
希望这有帮助。
我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。
我有一个包-'脚本' 根据剧本,我有两个类别——甲和乙 在一个类中,我有3个方法(@Test)按顺序编写- 在B班我有一种方法- TestNG. XML 在执行时——作为TestNG套件——右键单击TestNG XML并选择Run as a TestNG Suite 类B首先执行-这是因为类B中的@Test没有指定优先级,因此成为最高优先级 有没有办法让@Test的优先级只在类中起作用?为什么Te
我正在将并行执行引入我的testNG套件中。当我将“parallel”设置为“tests”时,两个浏览器打开,两个测试的第一个类同时开始--这是我所期望的。当我将其设置为“classes”时,我希望第一个测试中的两个类同时开始,但是只有一个浏览器打开,第一个类中的第一个方法执行,然后用第二个类中的第一个方法打开一个新的浏览器,依此类推。谁能告诉我我做错了什么? 下面是我的xml文件:
当我试图在Selenium Grid 2旁边使用TestNG并行运行测试时,我似乎遇到了一个问题。 尽管打开的浏览器数量与我正在运行的测试数量相匹配,但所有测试的所有指令都被发送到同一个浏览器窗口。例如,每个测试都会打开一个页面并尝试登录。四个浏览器窗口将打开,但一个浏览器窗口将导航到登录页面四次,然后键入用户名四次,而其余的浏览器窗口保持不活动。 以下是我如何启动网格: xml套件是这样设置的:
类TestParallel.FirstTestClass线程ID:22名称:TestNG 类TestParallel.SecondTestClass线程ID:23名称:TestNG 类TestParallel.TestSetup线程ID:23名称:TestNG java.lang.NullPoInterException位于TestParallel.TestSetup.OnTestFailure(