在appium自动化测试过程中部分设备会存在各种状况影响自动化脚本的执行。如设备锁屏,安装时权限弹窗处理等等(oppo和vivo设备安装app时需要进行弹窗确认,还需要输入密码) 那么该如何处理这些设备的的状态来保证自动化运行的成功率?
其实我们可以使用adb命令来处理,比如检测失败是否亮屏,点亮屏幕,点击弹窗、滑动操作、输入密码、切换输入法操作等等。下面我们将一一展示其用法。
oppo/vivo机型系统目前不允许设置设备屏幕一直保持常亮,最多30分钟就会休眠,我们可以使用adb来检测屏幕状态,根据屏幕状态来进行对应的操作。
使用如下命令可以检测屏幕是否休眠,mAwake=true
说明设备是未休眠的,如果mAwake=false
说明设备是休眠状态。
adb shell "dumpsys window policy | grep mAwake"
mAwake=true
注意:部分机型返回的可能和上面的结果有差异,如华为和小米机型的返回结果有一些不同,返回结果样式一般如下:
mAwake=truemScreenOnEarly=true mScreenOnFully=true
如果设备是休眠状态我们需要点亮屏幕,使用下面命令可以点亮屏幕。
adb shell input keyevent 26
26
表示电源键,上面的命令表示按电源键把设备屏幕点亮。其实adb还可以模拟其他按键操作详见:keyevent code详解
设备屏幕点亮之后可能还需要向上滑动或者输入密码解锁,adb可以模拟滑动和点击操作
adb shell input swipe 540 2270 540 240 100 #滑动操作
adb shell input tap 530 2192 #点击操作
swipe
后面的数字分别是滑动起点的坐标和终点的坐标,最后一个数字是滑动持续的时间,单位:毫秒 tap
后面的是点击位置的坐标,坐标获取可以在开发者选项中开启指针位置即可获得。
安装app过程中出现权限弹窗或者需要输入密码的场景该如何处理?其实我们可以使用多线程来处理,一个线程负责执行安装命令,另外一个线程处理弹窗即可。
我们先定义一个安装app的方法install_app()
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
命令是用于在弹出的输入框输入安装密码
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个方法加载进来
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命令来切换。
首先可以使用如下命令查看设备的输入法
adb shell ime list -s
io.appium.android.ime/.UnicodeIME
com.sohu.inputmethod.sogou/.SogouIME
com.htc.sense.ime/.HTCIMEService
io.appium.settings/.UnicodeIME
然后使用如下命令即可切换输入法
adb shell ime set io.appium.settings/.UnicodeIME #修改为appium输入法
adb shell ime set com.htc.sense.ime/.HTCIMEService #修改为系统输入法
注意:部分设备系统由于WRITE_SECURE_SETTINGS
安全权限限制,如oppo R15执行命令修改无效,需要root设备后才能修改生效。