Skip to content

设备交互Api

设备交互 Api

简介

设备交互是自动化测试工具与移动设备进行沟通和掌握的过程,它不仅限于基本的应用元素点击和输入等操作。

在移动端应用程序测试中,设备交互的范围扩展到模拟通信方面和模拟设备本身的功能和行为,会涉及到设备的通信行为,例如模拟电话呼叫和短信发送,以及控制设备的一些系统级别的功能,例如网络连接状态、屏幕方向等。

设备交互应用场景

  • 模拟电话和短信:在测试通讯类应用程序时,模拟电话呼叫和接听、发送和接收短信等操作。
  • 网络模式:模拟不同的网络条件,如良好、较差或无网络连接等,可以测试应用程序在不同网络环境下的性能和容错能力。
  • 横竖屏切换:通过模拟设备从横屏到竖屏或从竖屏到横屏的切换,可以验证应用程序在不同屏幕方向下的布局和显示效果。
  • App 处理:模拟应用程序被其他应用或系统中断(如来电、短信、通知等),然后再返回到应用程序中,可以测试应用程序在中断和恢复过程中的稳定性和用户体验。
  • 录屏:录制设备屏幕上的操作过程。

常用基础操作

锁屏与解锁

通过 Capability 参数实现

  • 解决 app 自动化执行时,操作设备时遇到需要解锁屏幕的问题
  • unlockType 可以设置为:pinpasswordpatternfingerprint 其中一个,分别对应 pin,密码,手势解锁以及指纹解锁四种方式
  • unlockKey 为具体值:对应不同的解锁方式存在不同的值

Python 示例:

desired_caps={}
desired_caps['unlockType']="password"
desired_caps['unlockKey']="111111"

Java 示例:

DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("unlockType", "password");
caps.setCapability("unlockKey", "111111");

通过方法实现

  • 锁屏: 锁屏操作,seconds 设置锁屏时长
    • Python: lock(self,seconds)
    • Java: lockDevice(Duration.ofSeconds(seconds))
  • 解锁:
    • Python:unlock()
    • Java:unlockDevice()
  • 判断是否锁屏: 如果是锁屏状态返回 True
    • Python: is_locked(self)
    • Java: isDeviceLocked();

截图与录屏

  • 截图有两个方式:

    • Python:

      • get_screenshot_as_file('./photos/img01.png')
      • save_screenshot('./photos/img02.png')
    • Java: getScreenshotAs();

  • 录屏:模拟器需要 androidAPI>27,华为不支持,只支持 8.0 以上的版本。

    • 开始录制:

      • Python: start_recording_screen()
      • Java: startRecordingScreen();
    • 结束录制:

      • Python: stop_recording_screen()
      • Java: stopRecordingScreen();

打开通知栏

  • 打开通知栏:
    • Python: open_notifications()
    • Java: openNotifications()

获取当前屏幕分辨率

  • 获取当前屏幕分辨率:
    • Python: get_window_size()
    • Java: driver.manage().windows().getSize()

模拟电话、短信

Appium 提供了模拟来电和短信的功能,这在测试中可用于验证应用在接收来电或短信时的响应。需要注意的是,这些模拟功能仅限于原生模拟器,不支持第三方的模拟器。

Python 示例:

## 向号码拨打电话
driver.make_gsm_call("13822233001", GsmCallActions.CALL);
## 接听来自当前号码的电话
driver.make_gsm_call("13822233001", GsmCallActions.ACCEPT);
## 电话保持
driver.make_gsm_call("13822233001", GsmCallActions.HOLD);
## 终止与号码的通话,可用于取消拨号或挂断通话
driver.make_gsm_call("13822233001", GsmCallActions.CANCEL);
## 接收到来自该号码的短信
driver.send_sms("555-123-4567", "hello Appium");

Java 示例:

// 向号码拨打电话
driver.makeGsmCall("13822233001", GsmCallActions.CALL);
// 接听来自当前号码的电话
driver.makeGsmCall("13822233001", GsmCallActions.ACCEPT);
// 电话保持
driver.makeGsmCall("13822233001", GsmCallActions.HOLD);
// 终止与号码的通话,可用于取消拨号或挂断通话
driver.makeGsmCall("13822233001", GsmCallActions.CANCEL);
// 接收到来自该号码的短信
driver.sendSMS("555-123-4567", "hello Appium");

网络设置

只有 Android 可以使用 Python: set_network_connection(self,connection_type)、Java: setConnection(ConnectionState) 进行网络设置,使用数字或导入ConnectionType类进行传参设置.

  • 方式一:使用数字传参设置 0、1、2、4、6,driver.set_network_connection(1)
  • 方式二:导入ConnectionType类进行传参设置,driver.set_network_connection(ConnectionType.ALL_NETWORK_ON)

Python 示例:

## 获取当前网络状态
print(driver.network_connection)
## 设置为飞行模式
driver.set_network_connection(1)
## 只开启Wifi
driver.set_network_connection(2)
## 设置为只有数据为开启状态
driver.set_network_connection(4)
## 数据与Wifi均打开
driver.set_network_connection(6)

Java 示例:

// 获取当前网络状态
System.out.println(driver.getConnection());
// 设置为飞行模式
driver.setConnection(new ConnectionState(1));
// 只开启Wifi
driver.setConnection(new ConnectionState(2));
// 设置为只有数据为开启状态
driver.setConnection(new ConnectionState(4));
// 数据与Wifi均打开
driver.setConnection(new ConnectionState(6));

横竖屏切换

实现横竖屏切换的功能可以通过设置 driver 的属性 orientation 来修改。

属性值的含义如下:

  • LANDSCAPE:切换为横屏
  • PORTRAIT:切换为竖屏

Python 示例:

# 输出当前 driver 的属性
print(driver.orientation)
# 设置为横屏
driver.orientation == 'LANDSCAPE'
# 设置为竖屏
driver.orientation == 'PORTRAIT'

Java 示例:

// 输出当前 driver 的属性
System.out.println("Current Orientation: " + driver.getOrientation());
// 设置为横屏
driver.rotate(ScreenOrientation.LANDSCAPE);
// 设置为竖屏
driver.rotate(ScreenOrientation.PORTRAIT);

获取当前设备时间

Appium 提供了一个获取设备实际时间的方法,可通过调用 getDeviceTime 来获取。 - get_device_time(self,format=None): - 获取设备当前时间,format为日期时间格式设置,默认为'YYYY-MM-DDTHH:mm:ss`

Python 示例:

# 打印出设备的实际时间
print(driver.get_device_time())

Java 示例:

// 打印出设备的实际时间
System.out.println(driver.getDeviceTime());

总结

  • 常见设备交互操作