Automation 在appium iOS中切换两个应用程序

Automation 在appium iOS中切换两个应用程序,automation,automated-tests,appium,ios-ui-automation,appium-ios,Automation,Automated Tests,Appium,Ios Ui Automation,Appium Ios,我有一个测试用例,在iPhone中我必须 1.在应用程序a中执行任务。 2.切换到Safari浏览器并执行任务 3.再次切换回应用程序A并继续执行其他任务 目前,我可以执行1和2,然后切换回应用程序A,但从safari浏览器切换后,我无法执行应用程序A中的任何任务。我所做的如下 首先,为了启动应用程序A,我使用了以下代码 public void createAppiumDriver() throws MalformedURLException, InterruptedException { De

我有一个测试用例,在iPhone中我必须 1.在应用程序a中执行任务。 2.切换到Safari浏览器并执行任务 3.再次切换回应用程序A并继续执行其他任务

目前,我可以执行1和2,然后切换回应用程序A,但从safari浏览器切换后,我无法执行应用程序A中的任何任务。我所做的如下

首先,为了启动应用程序A,我使用了以下代码

public void createAppiumDriver() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "iPhone 7 Plus");
capabilities.setCapability("platformName", "iOS");
capabilities.setCapability("platformVersion", "11.2"); 
capabilities.setCapability("autoWebView", true);
capabilities.setCapability("app", getProperties().getProperty("appURL"));
capabilities.setCapability("autoAcceptAlerts", true);
capabilities.setCapability("useNewWDA", true);
capabilities.setCapability("startIWDP",true);
iosDriver = new IOSDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);}
要从我的应用程序切换到Safari,我启动了一个新会话,使用以下代码切换到Safari

public void openSafari() throws MalformedURLException {
DesiredCapabilities capabilities2 = new DesiredCapabilities();
capabilities2.setCapability("deviceName", "iPhone 7 Plus");
capabilities2.setCapability("platformName", "iOS");
capabilities2.setCapability("platformVersion", "11.2");
capabilities2.setCapability("browserName", "Safari");
capabilities2.setCapability("autoAcceptAlerts", true);
capabilities2.setCapability("useNewWDA", true);
iosDriver2 = new IOSDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities2);
iosDriver2.get("https://www.gmail.com");}
现在的问题是,在我再次创建一个新会话的那一刻,我需要从safari浏览器再次切换回App A来执行一些任务,如下所示

public void switchToNutrifix() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilities3 = new DesiredCapabilities();
capabilities3.setCapability("deviceName", "iPhone 7 Plus");
capabilities3.setCapability("platformName", "iOS");
capabilities3.setCapability("platformVersion", "11.2"); //Replace this with your iOS version
capabilities3.setCapability("autoWebView", true);
capabilities3.setCapability("app", getProperties().getProperty("appURL"));
capabilities3.setCapability("autoAcceptAlerts", true);
capabilities3.setCapability("useNewWDA", true);
capabilities3.setCapability("startIWDP",true);
iosDriver3 = new IOSDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities3);}
现在的问题是,应用程序A再次从Safari打开,但它无法识别应用程序中的元素。我甚至将上下文正确地更改为webview,但在从Safari浏览器切换后,它仍然无法在应用程序A中执行任何任务。有人能告诉我我在这里做错了什么,或者用另一种方法来切换吗

我经常犯的错误是

May 09, 2018 6:43:42 PM org.openqa.selenium.support.ui.ExpectedConditions findElement
WARNING: WebDriverException thrown by findElement(By.xpath: //div[@class='login-content purpose']/h2)
org.openqa.selenium.remote.SessionNotFoundException: A session is either terminated or not started (WARNING: The server did not provide any stacktrace information)
然后显示appium日志

debug] [iOS] No key id found. Choosing first id from page array
[debug] [iOS] Page change not referring to currently selected app, ignoring.

由于使用XCode 9 Appium的支持多个会话,我建议同时使用两个会话:app和safari:

  • 为本机应用程序创建驱动程序(例如
    driver1
    object)
  • 若要在应用程序中使用,请保持驱动程序实例处于活动状态
  • 提示:您可以将其置于后台:
    driver.runAppInBackground(持续时间为1分钟)

  • 为safari创建驱动程序(例如
    driver2
    object)
  • 是否需要在safair中使用,如果不需要,请关闭
    driver2
  • 继续为本机应用程序使用
    driver1
  • 公共类开关bTnappsios{
    公共应用程序驱动程序;
    公共所需功能createAppiumDriver()
    抛出异常的异常异常,中断异常{
    DesiredCapabilities=新的DesiredCapabilities();
    setCapability(“deviceName”、“iPhone7 Plus”);
    能力。设置能力(“平台名”、“iOS”);
    能力。设置能力(“平台版”、“11.2”);
    setCapability(“autoWebView”,true);
    setCapability(“app”,getProperties().getProperty(“appURL”);
    能力。设置能力(“自动接受者”,真);
    能力。设置能力(“useNewWDA”,true);
    能力。设置能力(“startIWDP”,真);
    返回能力;
    }
    公共所需功能openSafari()
    抛出错误的DurException{
    DesiredCapabilities=新的DesiredCapabilities();
    setCapability(“deviceName”、“iPhone7 Plus”);
    能力。设置能力(“平台名”、“iOS”);
    能力。设置能力(“平台版”、“11.2”);
    能力。设置能力(“浏览器名”、“Safari”);
    能力。设置能力(“自动接受者”,真);
    能力。设置能力(“useNewWDA”,true);
    返回能力;
    }
    public void switchBetweenApps()引发错误的DurException、InterruptedException
    {
    DesiredCapabilities nativeAppCaps=createAppiumDriver();
    iosDriver=新iosDriver(新URL(“http://0.0.0.0:4723/wd/hub()、nativeAppCaps);
    /**
    *在本机应用程序上执行操作
    */
    DesiredCapabilities webCaps=createAppiumDriver();
    iosDriver=新iosDriver(新URL(“http://0.0.0.0:4723/wd/hub"(网址:webCaps),;
    iosDriver.get(“https://www.gmail.com");
    /**
    *在safari浏览器上执行操作
    */
    //再次切换到本机应用程序
    iosDriver=新iosDriver(新URL(“http://0.0.0.0:4723/wd/hub()、nativeAppCaps);
    }
    }
    
  • 无论您在何处使用驱动程序实例,都会传递最新的驱动程序实例
  • 如果是这种情况,请使用RemoteWebElement而不是MobileElement

  • 有一种更好的切换b/w iOS应用程序的方法,而不是像上面的回答中所建议的那样一次又一次地创建驱动程序会话

    IOSDriver driver = new IOSDriver<>(new URL("http://localhost:4723/wd/hub"), capabilities);
    
    try {
    HashMap<String, Object> args = new HashMap<>();
    args.put("bundleId", SWITCH_APP_BUNDLE_ID);
    driver.executeScript("mobile: launchApp", args);
    
    /*
    TODO code for switch app
    */
    
    
    // Now reactivate  AUT App
    args.put("bundleId", AUT_APP_BUNDLE_ID);
    driver.executeScript("mobile: activateApp", args);
    
    /*
    TODO code for AUT App
    */
    } 
    finally {
    // quit driver     
    }
    
    IOSDriver-driver=新的IOSDriver(新的URL(“http://localhost:4723/wd/hub(能力),;
    试一试{
    HashMap args=newhashmap();
    参数put(“bundleId”,开关应用程序捆绑ID);
    driver.executeScript(“mobile:launchApp”,args);
    /*
    交换机应用程序的TODO代码
    */
    //现在重新激活AUT应用程序
    参数put(“bundleId”,自动应用程序bundleId);
    driver.executeScript(“mobile:activateApp”,args);
    /*
    AUT应用程序的TODO代码
    */
    } 
    最后{
    //退出驱动程序
    }
    
    我尝试使用driver.runAppInBackground(5);但它所做的是,应用程序在后台等待5秒钟,然后再次弹出,而不移动到safari浏览器。只有当它在5秒钟后弹出时,它才会去狩猎。所以我使用了driver.runAppInBackground(-1),所以它不会再次自动弹出。但我不知道在使用safari后如何恢复应用程序。我尝试使用driver.launchapp(),但它只是重新安装了应用程序&它无法识别应用程序中的元素。您是否尝试装入两个驱动程序实例?这是唯一的方法,因为使用appium/XSuite测试,您很可能无法在一个会话中检查两个应用程序。
    IOSDriver driver = new IOSDriver<>(new URL("http://localhost:4723/wd/hub"), capabilities);
    
    try {
    HashMap<String, Object> args = new HashMap<>();
    args.put("bundleId", SWITCH_APP_BUNDLE_ID);
    driver.executeScript("mobile: launchApp", args);
    
    /*
    TODO code for switch app
    */
    
    
    // Now reactivate  AUT App
    args.put("bundleId", AUT_APP_BUNDLE_ID);
    driver.executeScript("mobile: activateApp", args);
    
    /*
    TODO code for AUT App
    */
    } 
    finally {
    // quit driver     
    }