我用 appium 成功配置了我的 selenium 网格。我成功地为两个不同的 android 设备创建了驱动程序。假设 d1 和 d2。现在我想在它们之间保持接收器意味着我的驱动程序使用 d1 执行一些操作,然后在驱动程序 d2 上完成另一个操作。当我在 d2 上进行操作时,另一个驱动程序 d1 应该是理想的 但是当我在第二个驱动程序上进行操作时,然后在第一台设备上,应用程序在切换到第一台设备后处于后台 它给我一个 session 无效的错误。请在这里帮助我,我该怎么办?我应该实现多线程吗?或者有什么方法可以让第一个驱动程序处于理想状态,而第二个驱动程序正在执行该操作?
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.ObjectUtils.Null;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
public class selenium_grid_example
{
AppiumDriver d1,d2;
String id = null;
DesiredCapabilities capabilities2= new DesiredCapabilities();
@Test(priority=1)
public void two_driver() throws InterruptedException{
DesiredCapabilities capabilities1= new DesiredCapabilities();
capabilities1.setCapability("deviceName","xxxx");
capabilities1.setCapability("platformVersion", "5.1");
capabilities1.setCapability("appPackage", "xxxx);
capabilities1.setCapability("appActivity", "xxxx");
capabilities1.setCapability("udid", "xxxx");
capabilities1.setCapability("commandTimeout", 10000);
try {
d1 = new AndroidDriver(new URL("http://127.0.0.1:4728/wd/hub"), capabilities1);
} catch (MalformedURLException e) {
System.out.println("Not able to start application");
e.printStackTrace();
}
d1.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);
capabilities2.setCapability("deviceName","xxxx");
capabilities2.setCapability("platformVersion", "xxx");
//capabilities.setCapability("app",app.getAbsolutepath());
capabilities2.setCapability("appPackage", "xxxx");
capabilities2.setCapability("appActivity", "xxxx");
capabilities2.setCapability("udid", "xxxx");
capabilities2.setCapability("commandTimeout", 1000);
d2.manage().timeouts().implicitlyWait(10000, TimeUnit.SECONDS);
}
@Test(priority=2)
public void login_to_application() throws MalformedURLException, InterruptedException{
here i am doing some operation on driver d1
d1.manage().wait(20000);
}
@Test(priority=3)
public void join_meeting(){
try {
d2= new AndroidDriver(new URL("http://127.0.0.1:4730/wd/hub"), capabilities2);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
here i am doing another operation on driver d2
when i am doing some operation here previously opened app get in background on device one
}
}
@AfterClass
public void quit_driver(){
try {
Thread.sleep(40000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Quiting driver");
d1.quit();
d2.quit();
System.out.println("Driver quited successfully");
}
}}
这里我得到了这个错误
org.openqa.selenium.remote.SessionNotFoundException:
Command duration or timeout: 9 milliseconds
Build info: version: 2.45.0, revision: 32a636c, time: 2015-03-05 22:01:35
System info: host: gs-1783, ip: 10.22.99.156, os.name: Windows 8, os.arch: amd64, os.version: 6.2, java.version: 1.8.0_45
Driver info: io.appium.java_client.android.AndroidDriver
Capabilities [{appPackage=com.fuze.fuzemeeting, networkConnectionEnabled=true, warnings={}, commandTimeout=10000, databaseEnabled=false, deviceName=Nexus, platform=LINUX, appActivity=com.fuze.fuzemeeting.ui.FuzeMainActivity, desired={appPackage=com.fuze.fuzemeeting, appActivity=com.fuze.fuzemeeting.ui.FuzeMainActivity, platformVersion=5.1, commandTimeout=10000, udid=0aee8e8b02e4223e, platformName=Android, deviceName=Nexus}, platformVersion=5.1, webStorageEnabled=false, locationContextEnabled=false, browserName=Android, takesScreenshot=true, javascriptEnabled=true, udid=0aee8e8b02e4223e, platformName=Android}]
Session ID: 46ce15cd-1e05-4d6a-a460-360dd64c0782
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:162)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:180)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:185)
at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:468)
at selenium_grid_example.quit_driver(selenium_grid_example.java:136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
at org.testng.internal.TestMethodWorker.invokeAfterClassMethods(TestMethodWorker.java:225)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:114)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
最佳答案
我认为这是由于两个 session 都试图使用相同的 chrome-driver 端口引起的问题。
启动 Selenium Grid 节点时使用:
appium --nodeconfig/Path/to/Config.json -p XXXX -bp YYYY --chromedriver-port ZZZZ;
确保为每个节点指定三个单独的端口。
希望对您有所帮助,
利亚姆
关于android - 安卓并行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30192609/