Используйте Appium, чтобы позвонить на устройство Android

Буду признателен за помощь в автоматизации тестирования на устройствах Android. Мы используем код Appium и RemoteWebDriver для доступа к эмулятору Android, открываем наше приложение, нажимаем и перемещаемся по интерфейсу приложения, и все это, похоже, работает хорошо.

Однако, как часть моего тестирования, я хотел бы использовать Appium, чтобы инициировать телефонный звонок на устройстве, держать вызов открытым в течение минуты или около того, а затем положить трубку. Можно ли сделать это через объект RemoteWebDriver?

Если нет, каков рекомендуемый способ звонить на эмуляторе? Я видел некоторое обсуждение использования прямых вызовов telnet для эмулятора, но надеюсь, что есть лучший способ!

4 ответа

Вы можете установить эти желаемые возможности:

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

и используйте этот фрагмент для звонка через 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 секунд.

Вы можете использовать телефонный звонок, используя 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();
}
  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: идентификатор /endButton") нажмите ();

Оказывается, это возможно, хотя, возможно, немного более болезненно, чем я ожидал. Мне пришлось сделать две вещи: указать правильное приложение, которое нужно открыть, и обработать ссылки xpath на кнопки на клавиатуре. Действие com.android.contacts.activities.DialtactsActivity и xpath для некоторых кнопок:

  1. Числовое текстовое поле: /linear/linear/editText
  2. Кнопка № 1: / линейная / таблица / строка [1]/ кнопка изображения [1]
  3. Цифровая кнопка 5: / линейная / таблица / строка [2]/ кнопка изображения [2]
  4. Кнопка набора: / линейная / рамка / кнопка изображения

Если у кого-то есть лучший способ сделать это, я был бы очень рад это увидеть! Мартин

Другие вопросы по тегам