任何方式将应用程序放在后台并重新启动Appium iOS

时间:2014-03-19 07:09:31

标签: ios iphone automation appium

有没有办法在iOS自动化中使用Appium进行以下过程?

  1. 按主页按钮。
  2. 将应用置于后台。
  3. 打开其他应用(比如Gmail) - >在那里做手术。
  4. 然后重新启动我们的应用并恢复方法检查。
  5. 我试过这些:

    RemoteWebDriver wd = null;
    wd.close();
    

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

8 个答案:

答案 0 :(得分:5)

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

执行此操作的库存在于 C# Python Ruby 中如 Java

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

答案 1 :(得分:3)

适用于iOS

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

适用于Android

将应用程序置于背景中,即按Home键 -

((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();

答案 2 :(得分:2)

退出您正在测试的应用程序真的不容易。

我使用Appium(Selenium for Apps)来测试iOS应用。 我想要做的是按下主页按钮,遗憾的是Appium没有这样的功能(以及一大堆其他测试工具)。

所以我想要的是模拟按键 CMD + SHIFT + H ,这是模拟器等同于主页按钮。 对于大多数测试工具而言,这也是不可能的,因为他们在内部互动'模拟器,通过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内部进行测试。

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

答案 3 :(得分:1)

是的,没有什么不可能的 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设备),按回车键,youtube将在您的设备中自动开启 谢谢 我来自KMS Technology Vietnam

答案 4 :(得分:1)

以下是使用ruby库的方法:

background_app 2

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

答案 5 :(得分:0)

您是否尝试使用driver.execute_script "au.backgroundApp(5)"来设置应用后台?

此方法的问题在于,在5秒钟内您无法与设备交互,后台应用程序正在阻止。

答案 6 :(得分:0)

我发现使用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

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

答案 7 :(得分:0)

对于Android:

driver.pressKeyCode(AndroidKeyCode.HOME);

对于iOS:

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