Win10系统下基于Docker搭建Appium容器并连接安卓模拟器Genymotion完成移动端Python自动化测试的热门话题之一。进入7月,招聘市场对Python自动化的热情并未消退,那么Python自动化能为我们做什么呢?首先,Python自动化可以避免熟练工人的重复工作。对于功能比较齐全、功能成熟的软件,每推出一个新版本,不管是大版本还是小版本,大部分的功能和界面都与之前的版本几乎相似。或者完全一样,但是所谓的向上兼容,你不能因为新功能的产生而不去测试老版本的功能,而这些老功能是在上一个版本上线的时候测试的,所以这部分该功能特别适用于自动化测试。可以让测试达到测试每一个特性的目的。第二,Python自动化可以帮助我们提高测试效率:比如一个项目的开发周期只有几个月,在测试期间,每周发布一个版本供测试人员测试。一个系统的功能点如下:几千到几万,人工测试非常耗时和繁琐,必然导致测试效率低下,而自动化流程恰恰帮助我们提高了测试效率。在手机App测试领域,如果有新的应用版本发布,QA人员面临的挑战是如何应对市面上上千款机型进行兼容性测试。毫无疑问,这是一个非常庞大的工程,更何况有些工程机在市场上根本买不到,比如谷歌的Nexus和Pixel系列手机,所以这次我们尝试使用Genymotion模拟器和Docker来在Win10系统下构建Appium容器,实现短时间内上千个模型的自动化测试工作。首先,Android模拟器为什么选择Genymotion。国内确实也有蓝神之类的模拟器可以选择,但是Genymotion作为安卓模拟器领域的佼佼者,启动和运行速度都非常快。它不仅支持多个Android版本,还支持多个Android系统同时启动运行,为我们并行测试脚本提供了便利。当然Genymotion也有自己的缺点,就是客户端版本是内核x86架构,不支持arm框架的应用,但是云服务已经支持了。arm架构,这在模拟器领域无疑是一大利好。进入Genymotion注册页面:https://www-v1.genymotion.com...注册成功后注意邮箱需要激活,然后进入下载页面:https://www.genymotion.com/do...这里Win10系统有两个版本,因为Genymotion内核是基于VirtualBox虚拟机的,所以如果没有安装VirtualBox,选择withVirtualbox,否则可以选择withoutVirtualbox,直接选择Genymotion本身。安装成功后,用刚才注册的账号登录,然后选择personaluse(个人版):然后选择要测试的机型,创建:创建手机对应的虚拟机,需要make一些设置可以保证虚拟机正常运行。在Virtualbox的通用选项中设置版本重新选择OhterLinux-64位并选择网络选项的混合模式:允许虚拟计算机,后面链接虚拟机时会用到:最后为了安全起见,是最好设置宿主机的hyper-v功能关闭,管理员权限打开终端,执行命令bcdedit/sethypervisorlaunchtypeoff重启电脑,启动手机模拟器,出现Android界面,提示说明配置成功:接下来我们来配置AndroidADB,什么是AndroidADB?ADB的整个过程就是AndroidDebugBridge,这是开发或者使用Android时非常常用的一个工具。您可以通过USB从计算机连接您的Android手机,并使用命令行来控制您的手机。这里我们主要使用adb命令获取虚拟机的终端ip,直接下载压缩包文件:https://dl.google.com/android...解压到C盘根目录,C:\platform-tools\_r31.0.2-windows\platform-tools然后配置这个目录的全局环境变量,这样就可以在终端直接访问了:C:\Users\liuyue>adb--versionAndroidDebugBridgeversion1.0.41Version31.0.2-7242960InstalledasC:\platform-tools_r31.0.2-windows\platform-tools\adb.exe现在执行设备列表命令:C:\Users\liuyue>adbdevicesListofdevices附上192.168.42.103:5555设备可以看到,我们刚刚启动的虚拟机已经出现在设备列表中,直接通过connect命令就可以连接了,和真机几乎一样:C:\Users\liuyue>adbdevicesListofdevicesattached192.168.42.103:5555deviceC:\Users\liuyue>adbconnect192.168.42.103:5555已连接to192.168.42.103:5555C:\Users\liuyue>现在轮到Docker上场了。Docker的任务是使用容器来运行Appuim自动化脚本,这样就避免了繁琐的Appuim安装配置环节。当然,你的电脑必须提前安装好Docker。如果不行,请移步:玩转win10系统下的DockerToolBox并更换国内镜像源(各种魔坑)然后下载Appium基础镜像,Dockerhub上的镜像混杂,这里是官方版:https://hub.docker.com/r/appi...执行命令:dockerpullappium/appium查看镜像:liuyue@DESKTOP-NVU6CCVMINGW32~$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEappium/appiumlatest70f3d328b9496weeksago1.55GB然后启动容器:dockerrun--privileged-d-p4723:4723--nameappiumappium/appium这里我们启动Appiumcontainer,端口映射到4723,privileged参数让它拥有root权限,后台执行-d随后查看容器运行状态:liuyue@DESKTOP-NVU6CCVMINGW32~$dockerrun--privileged-d-p4723:4723--nameappiumappium/appiuma2e8f11fdf7c561b075b563dfcc1efb6e5381e78dc3d4435a89cf8f97be52f6dliuyue@DESKTOP-NVU6CCVMINGW32~$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESa2e8f11fdf7cappium/appium"/bin/sh-c'/root/w..."7分钟前Up19秒4567/tcp,0.0.0.0:4723->4723/tcpappium此时,我们可以使用dockercontainer里面的adb服务已经运行:dockerexec-itappiumadbconnect192.168.42.103:5555可以看到docker连接手机配对成功:liuyue@DESKTOP-NVU6CCVMINGW32~$dockerexec-itappiumadbconnect192.168.42.103:5555连接到192.168.42.103:5555可以操作常用的adb命令,比如查看手机的Android版本:liuyue@DESKTOP-NVU6CCVMINGW32~$dockerexec-itappiumadbshellgetpropro.build。版本.发布5.0下面写一个简单的Appium自动化测试脚本集,先安装Appium库:pipinstallAppium-Python-Clientwriteappium\_test.py:fromappiumimportwebdrivercap={"platformName":"Android","platformVersion":"5","deviceName":"192.168.42.103:5555","udid":"192.168.42.103:5555",#真机#"platformName":"Android",#"platformVersion":"7.1.2",#"deviceName":"10d4e4387d74","noReset":True,"unicodeKeyboard":True,"resetkeyboard":True}driver=webdriver.Remote('https://192.168.99.100:4723/wd/hub',cap)#安装APPdriver.install_app(app_path='C:\\test.apk',replace=False,#不允许覆盖timeout=10000,#超时时间为10秒allowTestPackages=True,#允许测试包useSdcard=False,#不要安装在SdcardgrantPermissions=False)#授予权限driver.quit()这是192.168。42.103:5555是Genymotion模拟的手机客户端地址,https://192.168.99.100:4723/w...是基于Docker的Appium容器。这里我们给手机安装一个测试app安装运行脚本执行后,可以判断是否安装成功:fromappiumimportwebdrivercap={"platformName":"Android","platformVersion":"5","deviceName":"192.168.42.103:5555","udid":"192.168.42.103:5555",#真机#"platformName":"Android",#"platformVersion":"7.1.2",#"deviceName":"10d4e4387d74","noReset":True,"unicodeKeyboard":True,"resetkeyboard":True}driver=webdriver.Remote('https://192.168.99.100:4723/wd/hub',cap)#判断APP是否安装,通过的参数是包名res=driver。is_app_installed('com.tencent.android.qqdownloader')print(res)driver.quit()也可以使用脚本启动一些app,比如内置计算器应用:fromappiumimportwebdriverfromtimeimportsleepcap={"platformName":"Android","platformVersion":"5","deviceName":"192.168.42.103:5555","udid":"192.168.42.103:5555",#真机#"platformName":"Android",#"平台版本":"7.1.2",#"deviceName":"10d4e4387d74","appPackage":"com.android.calculator2","appActivity":"com.android.calculator2.Calculato","noReset":True,"unicodeKeyboard":True,"resetkeyboard":True}driver=webdriver.Remote('https://192.168.99.100:4723/wd/hub',cap)#等待3秒sleep(3)#将APP置于后台进行5秒时钟,然后切换回前台driver.background_app(5)#关闭APPdriver.close_app()sleep(3)#重启APPdriver.launch_app()sleep(3)driver.quit()这里计算器的包名和activity信息配置在cap变量中杀掉应用进程:fromappiumimportwebdrivercap={"platformName":"Android","platformVersion":"5","deviceName":"192.168.42.103:5555","udid":"192.168.42.103:5555",#真机#"platformName":"Android",#"platformVersion":"7.1.2",#"deviceName":"10d4e4387d74","appPackage":"com.android.calculator2","appActivity":"com.android.calculator2.Calculato","noReset":True,"unicodeKeyboard":True,"resetkeyboard":True}driver=webdriver.Remote('https://192.168.99.100:4723/wd/hub',cap)#等待3秒sleep(3)#如果应用程序未运行或正在后台运行,则激活应用程序driver.activate_app('com.android.calculator2')sleep(3)#终止应用程序driver.terminate_app('com.android.calculator2')sleep(3)driver.quit()几乎所有的移动应用程序操作都可以用Python脚本编写,用于自动化测试。我们可以把Appium理解为移动端的Selenium,使用起来非常方便。结语:莎士比亚说过,“一千个观众眼中有一千个哈姆雷特”。在数以万计的Genymotion模拟器中,移动应用程序也可以有数以千计的外观。通过编写Appium自动化脚本,测试人员可以从重复测试的劳动中解放出来。为什么不这样做呢?原文转载自《刘越的技术博客》https://v3u.cn/a_id_196
