此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

前俩天看到 Airtest 讨论群里面提出了 1 个有意思的问题:一位同学在测试自动装包的过程中,发现像 oppo、vivo 这类品牌的手机在装包过程中都需要输入账号密码,而这会直接让 install() 指令运行失败。

值得思考的是,我们如何保证在安装应用的过程中,同时完成输入账号密码的任务而不中断安装应用的任务呢?

利用多线程解决装包过程输入密码的问题

看到这里,相信很多同学已经想到了可以利用多线程来解决这个问题了。没错,利用 python 的多线程确实可以帮助我们轻松地实现同时 运行多个任务

关于新建线程,我们需要用到 python 标准库里面的 threading 模块:

from threading import Thread

# 新建1个新的线程
# 其中function为线程函数,args为传递给线程函数的参数,它必须是tuple类型
t1 = threading.Thread(function, args)

# 将线程设置为守护线程
t1.setDaemon(True)

# 启动线程活动
t1.start()

简单了解完 python 线程的一些基础用法,我们回到刚才的问题上来,在执行安装应用的任务之前,我们可以先开启 1 个线程,用于等待输入账号密码弹窗的弹出,以及输入账号密码、点击安装等操作:

完整的示例代码如下:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
from threading import Thread

auto_setup(__file__)

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)


def input_pw():
    sleep(5.0)
    # 等待弹窗出现
    wait(Template(r"tpl1604980843615.png", record_pos=(-0.001, -0.029), resolution=(720, 1440)),timeout=60)
    sleep(2.0)
    # 点击输入密码
    touch(Template(r"tpl1604978804097.png", record_pos=(0.211, 0.233), resolution=(720, 1440)))
    sleep(2.0)
    poco("com.coloros.safecenter:id/et_login_passwd_edit").click()
    poco("com.coloros.safecenter:id/et_login_passwd_edit").set_text("password")
    sleep(2.0)
    poco("android:id/button1").click()
    sleep(2.0)
    touch(Template(r"tpl1604979337502.png", record_pos=(-0.003, 0.608), resolution=(720, 1440)))

# 新建用于等待弹窗输入账号密码的线程
a_thread = Thread(target=input_pw)
a_thread.setDaemon(True)
a_thread.start()

install(r"D:\demo\tutorial-blackjack-release-signed.apk")

PS:感谢 Airtest 用户 “jxou” 提供了上述的解决思路。

知识拓展

1.install() 与 uninstall()

install()uninstall() 都是 Airtest 的核心 API,分别用于 安装应用和卸载应用 ,并且它们都 仅支持安卓平台

示例:

from airtest.core.api import *

install(r"D:\demo\tutorial-blackjack-release-signed.apk")
uninstall("org.cocos2dx.javascript")
2.install_app() 与 uninstall_app()

airtest 的安卓模块 下,也提供了安装和卸载应用的方法,分别是 install_app()uninstall_app()

相比于 install() 方法,install_app(filename,replace=False,install_options=[]) 的参数更加丰富:

其中,install_options 的参数含义如下:

示例:

from airtest.core.android.android import *

android = Android()
# 非覆盖安装
android.install_app(r"D:\demo\tutorial-blackjack-release-signed.apk",False)
# 覆盖安装
android.install_app(r"D:\demo\tutorial-blackjack-release-signed.apk",True)

android.uninstall("org.cocos2dx.javascript")

另外这个安卓模块下,还提供了一些其它的与应用相关的方法:

实际的测试应用中,比如我们要往设备中安装某个应用,可以先使用 check_app(package) 检查当前设备是否已经安装了该应用,然后再决定是直接安装还是覆盖安装:

from airtest.core.android.android import *

android = Android()
try:
    android.check_app("org.cocos2dx.javascript")
    print("当前设备已存在待安装应用,执行覆盖安装")
    android.install_app(r"D:\demo\tutorial-blackjack-release-signed.apk",True)
except AirtestError:
    print("当前设备不存在待安装应用,执行非覆盖安装")
    android.install_app(r"D:\demo\tutorial-blackjack-release-signed.apk",False)
3.start_app()、stop_app() 与 clear_app()

其它常用于应用操作的方法还有 start_app()stop_app()clear_app()

小结

今天主要跟大家分享了用多线程解决自动装包过程需要输入账号密码的问题,另外还给大家补充了一些 airtest 在应用操作这方面的方法,奉上新鲜整理好的思维导图,有需要的同学可以先保存起来方便后续查看哦:


Airtest 官网:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b


↙↙↙阅读原文可查看相关链接,并与作者交流