App自动化测试设备弹窗处理

前言

在appium自动化测试过程中部分设备会存在各种状况影响自动化脚本的执行。如设备锁屏,安装时权限弹窗处理等等(oppo和vivo设备安装app时需要进行弹窗确认,还需要输入密码) 那么该如何处理这些设备的的状态来保证自动化运行的成功率?

其实我们可以使用adb命令来处理,比如检测失败是否亮屏,点亮屏幕,点击弹窗、滑动操作、输入密码、切换输入法操作等等。下面我们将一一展示其用法。

屏幕状态

oppo/vivo机型系统目前不允许设置设备屏幕一直保持常亮,最多30分钟就会休眠,我们可以使用adb来检测屏幕状态,根据屏幕状态来进行对应的操作。

屏幕状态检测

使用如下命令可以检测屏幕是否休眠,mAwake=true说明设备是未休眠的,如果mAwake=false说明设备是休眠状态。

1
2
adb shell "dumpsys window policy | grep mAwake"
mAwake=true

注意:部分机型返回的可能和上面的结果有差异,如华为和小米机型的返回结果有一些不同,返回结果样式一般如下:

1
mAwake=truemScreenOnEarly=true mScreenOnFully=true

屏幕激活

如果设备是休眠状态我们需要点亮屏幕,使用下面命令可以点亮屏幕。

1
adb shell input keyevent 26

26表示电源键,上面的命令表示按电源键把设备屏幕点亮。其实adb还可以模拟其他按键操作详见: keyevent code详解

屏幕解锁

设备屏幕点亮之后可能还需要向上滑动或者输入密码解锁,adb可以模拟滑动和点击操作

1
2
adb shell input swipe 540 2270 540 240 100  #滑动操作 
adb shell input tap 530 2192 #点击操作

swipe后面的数字分别是滑动起点的坐标和终点的坐标,最后一个数字是滑动持续的时间,单位:毫秒 tap 后面的是点击位置的坐标,坐标获取可以在开发者选项中开启指针位置即可获得。

安装弹窗

安装app过程中出现权限弹窗或者需要输入密码的场景该如何处理?其实我们可以使用多线程来处理,一个线程负责执行安装命令,另外一个线程处理弹窗即可。

安装

我们先定义一个安装app的方法install_app()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import subprocess
def install_app(app_path):
'''
安装app
:param app_path: app安装路径
:return:
'''
install_result=''
cmd="adb install " + app_path
install_result = os.popen(cmd).readlines()


if 'Success\n' in install_result:
logging.info(' 设备安装成功!' ))
else:
logging.info('安装失败)

弹窗处理

然后定义一个方法install_dialog_handle()用于处理安装过程中的弹窗,这里是以oppo k1机型为例。adb shell input text 命令是用于在弹出的输入框输入安装密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import subprocess

def install_dialog_handle():
'''
安装时设备弹窗密码处理

:return:
'''
logging.info('安装准备进行弹窗处理')
# oppo k1

sleep(10)

subprocess.call("adb shell input text 'mgtv2018' ", shell=True) #开始输入密码
sleep(3)

subprocess.call("adb shell input tap 756 1441", shell=True) #appium输入法安装
subprocess.call("adb shell input tap 740 1010", shell=True) #默认输入法安装
sleep(7)

subprocess.call("adb shell input tap 508 1998", shell=True) #点击底部安装
sleep(3)

subprocess.call("adb shell input tap 517 2162", shell=True) #点击底部完成

多线程处理安装过程中弹窗

最后我们定义一个方法install_action()使用多线程把上面2个方法加载进来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import threading
def install_action(app_path):
'''
多线程安装app,自动处理安装过程中的弹窗
:param app_path: 安装包路径
:return:
'''
threads = []

#多线程处理弹窗
p1 = threading.Thread(target=install_app, args=(app_path))
threads.append(p1)
p2 = threading.Thread(target=install_dialog_handle, args=()
threads.append(p2)

#执行安装操作
for p in threads:
p.start()
for p in threads:
p.join()

除了使用adb来处理安装过程中的弹窗,还可以使用其他方法处理,具体可以参考:appium+python自动化47-app权限弹窗问题

输入法切换

自动化测试过程中经常会把系统默认输入法切换为appium输入法,但是运行完脚本之后我们需要把输入法切换为系统的默认输入法(appium输入法没有界面,不切换我们无法正常输入),我们依旧可以使用adb命令来切换。

首先可以使用如下命令查看设备的输入法

1
2
3
4
5
adb shell ime list -s
io.appium.android.ime/.UnicodeIME
com.sohu.inputmethod.sogou/.SogouIME
com.htc.sense.ime/.HTCIMEService
io.appium.settings/.UnicodeIME

然后使用如下命令即可切换输入法

1
2
adb shell ime set io.appium.settings/.UnicodeIME #修改为appium输入法
adb shell ime set com.htc.sense.ime/.HTCIMEService #修改为系统输入法

注意:部分设备系统由于WRITE_SECURE_SETTINGS安全权限限制,如oppo R15执行命令修改无效,需要root设备后才能修改生效。

参考资料