当前位置: 首页 > 知识库问答 >
问题:

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

越季萌
2023-03-14

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

目前,我可以执行1&2&然后切换回应用程序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");}

现在的问题是再次从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浏览器切换后,它仍然不能执行App 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.

共有1个答案

燕英逸
2023-03-14
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。
 类似资料:
  • 我正在自动运行一个本机iOS应用程序,点击“向Facebook注册”后,Facebook应用程序将打开,用户可以在其中输入登录凭据。问题是,Facebook应用程序打开后,没有任何元素可以与之交互,尽管它们位于Appium inspector中。那么,在返回到原始应用程序之前,有没有办法切换到Facebook应用程序并与之交互? Appium版本:1.4.13 Mac OS X:10.11.4设备

  • 假设你有两个活动-A和B,你从A开始B。在B中,你有一个任务。如果任务完成,您希望返回到按下when back键,如果没有,您希望取消整个应用程序。但在解除后,你可以从最近的应用程序菜单中恢复B。如果在那之后你需要同样的后退键的行为。 因此,我想放弃一个活动或整个应用程序(但简历的可能性)。有什么办法可以做到这一点吗?

  • 首先,我是新的反应和钩子。 我想做的是,当一个状态发生变化时,一个div或一些文本也会发生变化。 例如: 所以在这种情况下,我有我的切换按钮,它将在真或假状态之间切换。我通常使用它从div中添加/删除类,例如: 或者类似的东西。但是,我希望实现的是在上面的代码中显示两个前divs之间进行切换,或者在启动切换时在第一个divs中添加字。 我不太确定如何实现这一点,以及是否应该使用函数来实现这一点。

  • 我的模特。py看起来像: 模型中描述了“名称”和“站点”! 每当我尝试运行我的服务器时,我都会 django.db.utils.编程错误:除非使用可以解释8位字节串的text_factory(如text_factory=str),否则不得使用8位字节串。强烈建议您将应用程序切换到Unicode字符串。 我怎样才能将我的应用程序切换到上面提到的Unicode字符串,或者如果有其他方法来解决这个问题,

  • 问题内容: 正如教程向我展示的那样,我已经在最初的几个脚本上构建了一个不错的GUI,但是没有一个脚本解决更复杂的程序的问题。 如果在打开屏幕上有带有“开始菜单”的内容,并且在用户选择后移动到程序的其他部分并适当地重画屏幕,那么执行此操作的优雅方法是什么? 是否只是一个“开始菜单”框架,然后创建一个新的窗口小部件,并填充另一部分的小部件?并在他们按下“后退”按钮时逆转此过程? 问题答案: 一种方法是

  • 问题内容: 我想在Python中的两个值之间切换,即0到1之间。 例如,当我第一次运行一个函数时,它产生数字0。下一次,它产生1。第三次它返回零,依此类推。 抱歉,如果这样做没有道理,但是有人知道这样做的方法吗? 问题答案: 用途: 请注意,如果您需要比更为复杂的周期,那么此解决方案将比此处发布的其他解决方案更具吸引力。