Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;无法创建新会话";使用ThreadLocal类在AndroidDriver中运行并行执行时_Java_Selenium_Selenium Webdriver_Automation_Appium - Fatal编程技术网

Java &引用;无法创建新会话";使用ThreadLocal类在AndroidDriver中运行并行执行时

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

目标:在不同设备上并行执行测试类

实现简介:我已经创建了基类,在其中定义了功能,并创建了android驱动程序实例。除此之外,还有一个DriverFactory类,它实现了线程本地对象、set&get方法和testng.xml:我们定义了udid、url、platformName等参数

代码: 基类功能:

                // 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服务器端口中运行该设备。您还需要多个设备