我有一个测试用例,在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 浏览器切换回应用程序 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)
和应用程序日志显示
debug] [iOS] No key id found. Choosing first id from page array
[debug] [iOS] Page change not referring to currently selected app, ignoring.
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);
}
}
- 无论在哪里使用驱动程序实例,都会传递驱动程序的最新实例。
- 如果是这种情况,请使用 RemoteWebElement 而不是 MobileElement。
由于XCode 9 Appium 支持多个会话,我建议同时使用 2 个会话:应用程序和 safari:
- 为本机应用程序创建驱动程序(例如
driver1
对象( - 想要在应用程序中需要,保持驱动程序实例处于活动状态
提示:您可以将其放在背景中:driver.runAppInBackground(Duration.ofMinutes(1));
- 为 safari 创建驱动程序(例如
driver2
对象( - 想要你需要在萨费尔和关闭
driver2
如果你不需要它 - 继续将
driver1
用于本机应用
有一种更好的方法来切换黑白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
}