Используйте 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();
}
- нажмите кнопку возврата домой driver.sendKeyEvent(3);
Нажмите кнопку вызова. dr.sendKeyEvent(5);
найдите на панели набора номера driver.findElementById("com.android.dialer:id/dialpad_button").click();
введите номер с помощью ключа отправки или sendKeyEvents. driver.findElement(By.className("android.widget.EditText")) SendKeys(PhoneNumber).
Нажмите кнопку вызова driver.findElementById("com.android.dialer:id/dial_button"). Click ();
немного подождать и нажать кнопку завершения вызова.. Dr.findElementById ("com.android.dialer: идентификатор /endButton") нажмите ();
Оказывается, это возможно, хотя, возможно, немного более болезненно, чем я ожидал. Мне пришлось сделать две вещи: указать правильное приложение, которое нужно открыть, и обработать ссылки xpath на кнопки на клавиатуре. Действие com.android.contacts.activities.DialtactsActivity и xpath для некоторых кнопок:
- Числовое текстовое поле: /linear/linear/editText
- Кнопка № 1: / линейная / таблица / строка [1]/ кнопка изображения [1]
- Цифровая кнопка 5: / линейная / таблица / строка [2]/ кнопка изображения [2]
- Кнопка набора: / линейная / рамка / кнопка изображения
Если у кого-то есть лучший способ сделать это, я был бы очень рад это увидеть! Мартин