Java &引用;无法创建新会话";使用ThreadLocal类在AndroidDriver中运行并行执行时
目标:在不同设备上并行执行测试类 实现简介:我已经创建了基类,在其中定义了功能,并创建了android驱动程序实例。除此之外,还有一个DriverFactory类,它实现了线程本地对象、set&get方法和testng.xml:我们定义了udid、url、platformName等参数 代码: 基类功能:Java &引用;无法创建新会话";使用ThreadLocal类在AndroidDriver中运行并行执行时,java,selenium,selenium-webdriver,automation,appium,Java,Selenium,Selenium Webdriver,Automation,Appium,目标:在不同设备上并行执行测试类 实现简介:我已经创建了基类,在其中定义了功能,并创建了android驱动程序实例。除此之外,还有一个DriverFactory类,它实现了线程本地对象、set&get方法和testng.xml:我们定义了udid、url、platformName等参数 代码: 基类功能: // capabilities to run locally try { capabil
// capabilities to run locally
try {
capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 60);
capabilities.setCapability("appPackage", prop.getProperty("androidAppPackage"));
capabilities.setCapability("appActivity", prop.getProperty("androidAppActivity"));
capabilities.setCapability(MobileCapabilityType.UDID, udid);
log.info("DeviceUdid: " + udid);
capabilities.setCapability("app", mApkfilepath);
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, platformName);
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
capabilities.setCapability("newCommandTimeout", "15");
capabilities.setCapability("autoGrantPermissions", true);
capabilities.setCapability("noReset", false);
driver = new AndroidDriver<MobileElement>(new URL(url), capabilities); // exception "Session not created" at this line"
System.out.println("Driver: " + driver);
//return driver;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return driver;
private static DriverFactory instance = null;
private static ThreadLocal<AndroidDriver<MobileElement>> tdriver = new ThreadLocal<AndroidDriver<MobileElement>>();
// thread local driver object for android driver
private DriverFactory() {
}
public static DriverFactory getInstatnce() {
if (instance == null)
instance = new DriverFactory();
return instance;
}
// call this method to set the driver object
public void setDriver(AndroidDriver<MobileElement> driver) {
tdriver.set(driver);
}
// call this method to get the driver object & launch the app
public AndroidDriver<MobileElement> getDriver() {
return tdriver.get();
}
// call this method to remove the driver
public void removeDriver() {
tdriver.get().quit();
tdriver.remove();
}
//本地运行的功能
试一试{
能力。设置能力(MobileCapabilityType.NEW_命令超时,60);
setCapability(“appPackage”,prop.getProperty(“androidAppPackage”);
capabilities.setCapability(“appActivity”,prop.getProperty(“androidAppActivity”);
能力.setCapability(MobileCapabilityType.UDID,UDID);
日志信息(“设备udid:+udid”);
setCapability(“app”,mApkfilepath);
能力.setCapability(MobileCapabilityType.PLATFORM_NAME,platformName);
能力。设置能力(“Unicode键盘”,真);
能力。设置能力(“重置键盘”,真);
能力。设置能力(“超时”、“15”);
capabilities.setCapability(“autoGrantPermissions”,true);
能力。设置能力(“noReset”,false);
driver=新的AndroidDriver(新的URL,功能);//此行出现异常“未创建会话”
System.out.println(“驱动程序:“+Driver”);
//返回驱动器;
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回驱动器;
DriverFactory类:
// capabilities to run locally
try {
capabilities.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 60);
capabilities.setCapability("appPackage", prop.getProperty("androidAppPackage"));
capabilities.setCapability("appActivity", prop.getProperty("androidAppActivity"));
capabilities.setCapability(MobileCapabilityType.UDID, udid);
log.info("DeviceUdid: " + udid);
capabilities.setCapability("app", mApkfilepath);
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, platformName);
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
capabilities.setCapability("newCommandTimeout", "15");
capabilities.setCapability("autoGrantPermissions", true);
capabilities.setCapability("noReset", false);
driver = new AndroidDriver<MobileElement>(new URL(url), capabilities); // exception "Session not created" at this line"
System.out.println("Driver: " + driver);
//return driver;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return driver;
private static DriverFactory instance = null;
private static ThreadLocal<AndroidDriver<MobileElement>> tdriver = new ThreadLocal<AndroidDriver<MobileElement>>();
// thread local driver object for android driver
private DriverFactory() {
}
public static DriverFactory getInstatnce() {
if (instance == null)
instance = new DriverFactory();
return instance;
}
// call this method to set the driver object
public void setDriver(AndroidDriver<MobileElement> driver) {
tdriver.set(driver);
}
// call this method to get the driver object & launch the app
public AndroidDriver<MobileElement> getDriver() {
return tdriver.get();
}
// call this method to remove the driver
public void removeDriver() {
tdriver.get().quit();
tdriver.remove();
}
private static DriverFactory实例=null;
私有静态ThreadLocal tdriver=new ThreadLocal();
//android驱动程序的线程本地驱动程序对象
私人司机工厂(){
}
公共静态驱动器工厂getInstantnce(){
if(实例==null)
instance=newdriverfactory();
返回实例;
}
//调用此方法来设置驱动程序对象
公共无效设置驱动程序(AndroidDriver驱动程序){
tdriver.set(驱动程序);
}
//调用此方法获取驱动程序对象并启动应用程序
公共AndroidDriver getDriver(){
返回tdriver.get();
}
//调用此方法以删除驱动程序
公共空间被移除{
tdriver.get().quit();
tdriver.remove();
}
TestClass:
公共类HomePageTest扩展了基类{
public static AndroidDriver<MobileElement> driver;
HomePage homePage;
public HomePageTest() {
super();
}
@BeforeClass
@Parameters({ "platformName", "url" ,"udid" })
public void prepareTest(String platformName, String url, String udid) throws Exception {
try {
driver = BaseClass.createInstance(platformName, url , udid);
DriverFactory.getInstatnce().setDriver(driver);
driver = DriverFactory.getInstatnce().getDriver();
homePage = new HomePage(driver);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
公共静态AndroidDriver;
主页;
公共主页测试(){
超级();
}
@课前
@参数({“platformName”、“url”、“udid”})
public void prepareTest(字符串platformName、字符串url、字符串udid)引发异常{
试一试{
driver=BaseClass.createInstance(平台名、url、udid);
DriverFactory.GetInstantnce().setDriver(驱动程序);
driver=DriverFactory.getInstantnce().getDriver();
主页=新主页(驱动程序);
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
-它在单个设备上运行正常,但在并行运行测试时无法创建会话,这是一个例外,有时它需要一个设备的udid并在两个appium服务器上运行(具有不同的端口)这会导致跳过所有的测试用例。请查看代码并让我知道我缺少的位置要运行并行测试,您需要在不同的端口(每个设备的每个appium服务器)中运行appium服务器,提供每个设备的udid,并指定在特定的appium服务器端口中运行该设备。为此,您还需要多个设备-它在单个设备上运行正常,但在并行运行测试时无法创建会话,这是一个例外,有时它需要一个设备的udid并在两个appium服务器中运行(具有不同的端口)这将导致跳过所有测试用例。请查看代码并让我知道我缺少的位置要运行并行测试,您需要在不同的端口(每个设备的每个appium服务器)中运行appium服务器,提供每个设备的udid,并指定在特定的appium服务器端口中运行该设备。您还需要多个设备