【问题标题】:Any way to put app in background and relaunch in Appium iOS将应用程序置于后台并在 Appium iOS 中重新启动的任何方式
【发布时间】:2014-04-25 06:40:07
【问题描述】:

有没有什么方法可以在 iOS 自动化中使用 Appium 完成以下过程?

  1. 按主页按钮。
  2. 将应用置于后台。
  3. 打开其他应用程序(比如 Gmail)-> 在那里进行操作。
  4. 然后重新启动我们的应用程序并恢复方法检查。

我试过这些:

RemoteWebDriver wd = null;
wd.close();

但它只是退出了我正在自动化的应用程序(就像wd.quit()),然后当我尝试重新启动时 -> 它从头开始。我在 iPhone 模拟器上运行它。

【问题讨论】:

  • 嗨,我还不知道答案,但是将 wd 设置为 null n 然后调用 wd.close() - 这不会导致 NPE 吗?我也在寻找类似的行为。

标签: ios iphone automation appium


【解决方案1】:

Appium 实际上确实提供了允许您close the apprelaunch it (without starting from scratch)、锁定 SIM 卡等的客户端库。

C#PythonRuby 以及 @987654326 中存在执行此操作的库@

迁移到那些 WebDriver 而不是 selenium 的 WebDriver 非常简单且推荐,因为您可以访问 Appium 团队添加的所有好东西(例如摇动您的设备、复杂的点击、锁定设备等)

【讨论】:

  • 哈哈很好。很高兴知道他们最终实现了这一点。滑动也适用于 iOS 7.1?
  • 是的!至少他们的python客户端添加了它。 (用法:driver.swipe(start_x, start_y, end_x, end_y, duration_in_ms)。我目前最头疼的问题是如何将一系列滑动和点击串在一起来操作 UIDatePicker
  • 我没有让 closeApp() 正常工作(iOS),它也在关闭模拟器。好像我错过了什么!?
  • 嗨,我可以使用 api closeApp 但我想启动另一个已安装的应用程序作为测试用例的一部分。例如。我已经启动了我的应用程序“XYZ”,执行了一些步骤。我使用 runInBackground 或 closeApp 方法在后台发送了我的应用程序。现在我想启动其他已经安装的应用程序说“ABC”,有什么办法可以实现吗?提前致谢
  • @ChangdeoJadhav 这是这个问题的答案(几乎就是我在这里输入的内容):stackoverflow.com/a/24399468/3622606
【解决方案2】:

适用于 iOS

Xcode 不支持根据以下内容发送密钥:https://github.com/appium/appium/issues/4479 因此,一种可能的解决方法是:https://stackoverflow.com/a/24408831/2302437

适用于安卓

将应用程序置于后台,即按主页按钮-

((AppiumDriver) driver).sendKeyEvent(AndroidKeyCode.HOME);

要重新启动应用程序,我执行了以下操作 - 1.首先使用Monitor.bat识别菜单按钮,即我将其命名为"android.widget.TextView" at index 5.

2.点击它,即driver.findElementsByClassName("android.widget.TextView").get(5).click();

3.在菜单中找到您的应用程序并单击它。即

driver.findElementsByName(AppName).get(0).click();

【讨论】:

    【解决方案3】:

    退出您正在测试的应用确实不是那么容易。

    我正在使用 Appium (Selenium for Apps) 来测试 iOS 应用。 我想要做的是按下主页按钮,不幸的是 Appium 没有这样的功能(以及许多其他测试工具)。

    所以我要做的是模拟击键CMD+SHIFT+H,它相当于模拟器的home键。 大多数测试工具也无法做到这一点,因为它们通过 UIAutomation 在模拟器“内部”进行交互。

    最后我制定了以下解决方案(Java):

    Runtime runtime = Runtime.getRuntime();
    String[] args = { "osascript", "-e", "tell application \"System Events\" \n tell application \"Simulator\" to activate \n tell application \"System Events\" to keystroke \"h\" using {command down, shift down} \n end tell" };
    runtime.exec(args);
    

    这真的很简单:执行一个 Applescript,然后将击键发送到模拟器。

    为了提供一些可读性,这里又是简单的 Applescript:

    tell application "System Events"
      tell application "Simulator" to activate
      tell application "System Events" to keystroke "h" using {command down, shift down}
    end tell
    

    注意:确保在您的代码中转义“(带 \”)。还要确保在每行之后插入 \n,因为 Applescript 基于行。

    想出这个解决方案花了我很多时间。 我还没有找到任何其他可行的解决方案来退出应用程序,而无需终止整个测试并能够在 iOS 内部进行测试。

    编辑:然后您可以重新启动应用程序,这就是诀窍!

    【讨论】:

      【解决方案4】:

      是的,没有什么不可能 1.按主页键+ 2.将应用置于后台:

      AppiumDriver dr = MobileDriverFactory.getDriver()
                  try {
                      dr.runAppInBackground(2)
                  } catch (WebDriverException e) {
                      if (e.getMessage().contains("An error occurred while executing user supplied JavaScript")) {
                      } else {
                          throw new RuntimeException(e);
                      }
                  }
      

      此功能会欺骗 iOS 并将您的应用程序置于后台

      3.打开其他应用程序 + 4.然后重新启动我们的应用程序并恢复方法检查。

      ProcessBuilder pb = new ProcessBuilder("idevicedebug", "run", "YourAppNameHere")
                  Thread.sleep(5000)
                  Process p=pb.start()
                  Thread.sleep(5000)
              p.destroy()
      

      这个函数会调用你iOS设备中设置的任何应用,如果你想知道你的应用名称,打开终端,输入:

      ideviceinstaller -l
      

      它将列出您 iOS 设备中的所有应用,例如: com.google.ios.youtube,“11.11.8”,“YouTube” com.google.ios.gmail,“11.11.8”,“Gmail” 将样式为:com.xxx.xxx.xxx 的行复制到上面这段代码,也可以用终端播放这段代码,输入

      "idevicedebug run com.google.ios.youtube" 
      

      (请先插入您的 ios 设备),按 Enter,youtube 将在您的设备中自动打开 谢谢 我来自 KMS Technology 越南

      【讨论】:

        【解决方案5】:

        以下是使用 ruby​​ 库的方法:

        background_app 2
        

        其中 2 是您希望应用在后台运行的秒数。

        【讨论】:

        • 太棒了!救了我!
        【解决方案6】:

        您是否尝试过使用driver.execute_script "au.backgroundApp(5)" 为您的应用程序提供后台?

        这种方法的问题是,在这 5 秒内您无法与设备交互,backgroundApp 处于阻塞状态。

        【讨论】:

        • 所以,我绝对可以用这个命令后台应用程序。但是,出于好奇,这个命令记录在哪里?我在 UIAutomation 文档中找不到它,我正在寻找它上面的苹果文档。
        • 参考au.backgroundApp可以在这里找到Appium Discussion
        • 是的,我也找到了那个帖子。我一直在寻找实际的文档,但它们似乎并不存在。起初我并不清楚这是 appium 中的某些东西提供的命令,还是来自 Apple 的 UIAutomation。是前者。
        • 对,抱歉 - 这是docs的链接
        • 这就是我想要的。谢谢!
        【解决方案7】:

        我发现了一种将 Android Appium 与 Ruby 结合使用的更简单的解决方案:

          def switch_back_to_app
            # For Android
            #
            # To Put App in Background Press recent apps to close
            $driver.press_keycode(187)
        
            sleep(1)
            # To bring the same app back i.e Press recent apps to open
            $driver.press_keycode(187)
          rescue => e
            p e.exception
          end
          module_function :switch_back_to_app

        刷新代码,以便能够再次找到所有元素。

        【讨论】:

          【解决方案8】:

          对于安卓:

          driver.pressKeyCode(AndroidKeyCode.HOME);
          

          对于IOS:

          driver.executeScript("mobile: pressButton", ImmutableMap.of("name", "home"));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-14
            • 1970-01-01
            • 1970-01-01
            • 2022-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多