Переключение между двумя приложениями в appium iOS - PullRequest
0 голосов
/ 09 мая 2018

У меня есть тестовый пример, где в iPhone мне нужно 1. Выполните задачу в приложении А. 2. Переключитесь в браузер Safari и выполните задачу 3. Снова переключитесь в приложение A и продолжите другие задачи

В настоящее время я могу выполнить 1 и 2 и затем переключиться обратно в приложение A, но не могу выполнить никаких задач в приложении A после переключения из браузера Safari. Я сделал следующее.

Прежде всего, чтобы запустить приложение 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");}

Проблема, с которой я столкнулся, состоит в том, чтобы снова переключиться на приложение A из браузера Safari, чтобы выполнить некоторые задачи, для которых в данный момент я снова создал новую сессию, как показано ниже

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, но оно не может идентифицировать элементы в приложении. Я даже правильно изменил контекст на веб-просмотр, но все равно он не может выполнять никаких задач в приложении А после переключения из браузера Safari. Может кто-нибудь, пожалуйста, скажите мне, что я делаю не так, здесь или другой альтернативный способ сделать это переключение.

Я обычно получаю ошибку

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.

Ответы [ 3 ]

0 голосов
/ 17 августа 2018
public class SwitchBtnAppsiOS {

public AppiumDriver<RemoteWebElement>iosDriver;

public DesiredCapabilities 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);
    return capabilities;
}


public DesiredCapabilities openSafari() 
    throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "iPhone 7 Plus");
    capabilities.setCapability("platformName", "iOS");
    capabilities.setCapability("platformVersion", "11.2");
    capabilities.setCapability("browserName", "Safari");
    capabilities.setCapability("autoAcceptAlerts", true);
    capabilities.setCapability("useNewWDA", true);
    return capabilities;
}

public void switchBetweenApps() throws MalformedURLException, InterruptedException
{
    DesiredCapabilities nativeAppCaps = createAppiumDriver();
    iosDriver = new IOSDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), nativeAppCaps);

    /**
     * Perform the actions on native app
     */

    DesiredCapabilities webCaps = createAppiumDriver();
    iosDriver = new IOSDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), webCaps);
    iosDriver.get("https://www.gmail.com");

    /**
     * Perform the actions on safari browser 
     */

    // Again switch to native app
    iosDriver = new IOSDriver<>(new URL("http://0.0.0.0:4723/wd/hub"), nativeAppCaps);
}
}
  1. Где бы вы ни использовали экземпляры драйвера, передайте последний экземпляр драйвера.
  2. Используйте RemoteWebElement вместо MobileElement, если это так.
0 голосов
/ 17 августа 2018

Существует лучший способ переключения ч / б приложений 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     
}
0 голосов
/ 17 мая 2018

Поскольку с XCode 9 Appium поддерживает несколько сеансов , я предлагаю использовать 2 одновременных сеанса : app и safari:

  1. Создание драйвера для собственного приложения (например, driver1 объект)
  2. Хотите ли вы, чтобы приложение было в приложении, оставьте экземпляр драйвера живым

Подсказка: вы можете поместить его в фоновом режиме: driver.runAppInBackground(Duration.ofMinutes(1));

  1. Создание драйвера для сафари (например, driver2 объект)
  2. Хотите ли вы, чтобы вы были в безопасности, и закройте driver2, если вам это не нужно
  3. Продолжайте использовать driver1 для собственного приложения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...