【问题标题】:Use Appium to make a telephone call on Android device使用 Appium 在 Android 设备上拨打电话
【发布时间】:2018-03-12 22:58:20
【问题描述】:

如果能在 Android 设备上进行一些测试自动化,我将不胜感激。我们使用 Appium 和 RemoteWebDriver 代码来访问 Android 模拟器,打开我们的应用程序,点击并移动应用程序 UI,这一切似乎都运行良好。

但是,作为测试的一部分,我想使用 Appium 在设备上发起电话呼叫,保持通话打开一分钟左右,然后挂断。是否可以通过 RemoteWebDriver 对象执行此操作?

如果不是,在模拟器上进行调用的推荐方法是什么?我看过一些关于使用直接 telnet 调用模拟器的讨论,但希望有更好的方法!

【问题讨论】:

    标签: android appium phone-call


    【解决方案1】:

    您可以设置这些所需的功能:

          capabilities.setCapability("androidPackage", "com.android.dialer");
          capabilities.setCapability("appActivity", "DialtactsActivity");
    

    并使用这个 sn-p 通过 Appium 拨打电话:

    remoteWebDriver.findElement(By.id("com.android.dialer:id/search_view")).sendKeys("NAME_OF_PERSON");        
    remoteWebDriver.findElements(By.id("com.android.dialer:id/dialer_search_item_view")).get(0).click();
    

    这将调用第一个搜索项

        try {
            Thread.sleep(60000); //
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        remoteWebDriver.findElement(By.id("com.android.dialer:id/endButton")).click();
    

    这将在 60 秒后断开呼叫。

    【讨论】:

    • 我认为 op 意味着将他的应用程序后台化,然后进行调用,所以我认为使用功能设置包和活动没有意义。我认为可以在不更改测试上限的情况下打开另一个应用程序。并且还可以通过发送主页按钮键事件来使被测应用程序处于非阻塞背景。
    【解决方案2】:

    您可以使用 ADB 拨打电话:

    public static int makePhoneCall(AppiumDriver driver, Srting deviceId, String phoneNum, int callDuration) throws IOException, InterruptedException {
    
        callDuration *= 1000;
        cmd = "adb -s " + deviceId + " shell am start -a android.intent.action.CALL -d tel:" + phoneNum; //open a Dialer and placing a call right away
        Process exec = Runtime.getRuntime().exec(cmd); //starting a call and..
        Thread.sleep(callDuration);//..waiting for callDuration seconds before hangup
        driver.sendKeyEvent(6);// hang up phonecall
        return exec.exitValue();
    }
    

    【讨论】:

      【解决方案3】:

      事实证明这是可能的,尽管可能比我预期的要痛苦一些。我必须做两件事:指定要打开的正确应用程序,并计算出对拨号盘上按钮的 xpath 引用。活动是 com.android.contacts.activities.DialtactsActivity ,一些按钮的 xpath 是:

      1. 数字文本字段:/linear/linear/editText
      2. 数字 1 按钮:/linear/table/row[1]/imageButton[1]
      3. 5 号按钮:/linear/table/row[2]/imageButton[2]
      4. 拨号按钮:/linear/frame/imageButton

      如果有人有更好的方法来做到这一点,我会很高兴看到它!马丁

      【讨论】:

        【解决方案4】:
        1. 按主页按钮 driver.sendKeyEvent(3);
        2. 按下通话按钮。 dr.sendKeyEvent(5);

        3. 找到拨号盘 driver.findElementById("com.android.dialer:id/dialpad_button").click();

        4. 通过发送键或通过 sendKeyEvents 键入数字。 driver.findElement(By.className("android.widget.EditText")).sendKeys(phoneNumber);

        5. 按下通话按钮 driver.findElementById("com.android.dialer:id/dial_button").click();

        6. 稍等片刻,然后按结束通话按钮。 dr.findElementById("com.android.dialer:id/endButton").click();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-09
          • 2019-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多