这篇,我们开始来一个实战练习,如何通过appium自动把电脑上一个安卓程序包给安装到一台安卓手机中。在写脚本之前,我们需要统一下方法和工具。我们知道Appium和selenium一样都支持Java和Python,当然还有其他几个语言。那么,我们选择哪个语言来写我们的自动化测试脚本?Java还是Python?我也是第一次学习appium在安卓上的app自动化测试。Java和Python我都会,至少用来写脚本没有问题。我在写第一个例子之前,我搜索查询了一下,国内和国外,关于Python+Selenium的****,几乎没有,文章确实有,但是没有系统性的学习系列。反而Java+Appium很多资料,视频资料也有。所以,我觉得采用Python语言来写Appium的安卓端自动化测试脚本。
1.安装Appium client for python
我们已经确定了Python来写Appium脚本,那么我们需要下载一个Appium Client for Python语言。下载方法和简单,直接在电脑打开cmd界面,这里我们用Python3,输入命令:python -m pip install Appium-Python-Client,回车就自动开始安装,安装过程很快,不到十秒结束。安装了这个,我们才可以在脚本中写导入包语句,例如 from appium import webdriver,看到这个是不是很熟悉,所以,如果学习了Selenium,会更好加速学习appium自动化测试。
2.编程环境安装
这里,我还是采用Pycharm这个Python主流的IDE工具。虽然,这里是学习,每次学习一个API或者自动化一个场景,我们只需要写一个demo文件,运行测试一下,但是我还是建立了一个项目的结构,以后迟早会转移到自动化框架设计上来。例如,我把apk包放在了当前项目根目录下的app文件夹。需要去下载一个手机百度,安卓端的apk包。
一开始,我只在demo这个包下写脚本来练习appium的自动化测试,其他的目录如果没有提到,就全部默认是空文件或者空包,暂时不用去管。
3. 第一个脚本:自动化安装apk包到手机
- import os
- from appium import webdriver
- apk_path = os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) #获取当前项目的根路径
- desired_caps ={}
- desired_caps['platformName'] = 'Android' #设备系统
- desired_caps['platformVersion'] = '6.0.1' #设备系统版本
- desired_caps['deviceName'] = 'KIW-AL10' #设备名称
- # 测试apk包的路径
- desired_caps['app'] = apk_path + '\\app\\shoujibaidu.apk'
- # 应用程序的包名
- #desired_caps['appPackage'] = 'com.baidu.searchbox'
- #desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity'
- #如果设置的是app包的路径,则不需要配appPackage和appActivity,同理反之
- driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)#启动app
上面的desired_caps是一个字典,一开始定义一个空字典,然后根据键和值,设置了多个参数,这些参数就组成了一个字典对象。为什么需要这个字典参数对象呢?因为,需要手机发送一些手机参数给Appium服务器,这样Appium服务器才能处理请求,才能和手机中的程序联系起来。
windows上的appium是一个服务器,启动后之后,如果是第一次运行上面脚本,appium会在你手机里安装两个软件,一个是Appium Settings, 一个unlock。Appium Settings是一个client端,负责解释和执行Windows端appium的命令,而unlock只是一个用来唤醒手机屏幕,解锁的功能。第一次运行上面脚本,时间有点慢,因为先要安装Appium Settings和Unlock到你手机上,然后执行ADB命令去安装shoujibaidu.apk包,最后启动这个手机百度。启动过程,安卓上会弹出权限请求,例如sd卡读取权限,地理位置获取权限,这些,你需要手动去点击同意。目前,没有更好方法去自动化处理这个权限弹窗,因为这个不是一个app或者浏览器上的alert弹窗,所以,appium暂时不支持自动化这样操作。
4.查看Appium服务运行日志
运行脚本结束,我们点击windows上Appium界面的stop server按钮,看到日志文件,当然可以到处到一个xxxx.log文件,用notepad++来看日志。日志太多,这里简单来看一些,我们很容易看懂的内容。
4.1 Appium创建一个连接session
- [info] [Appium] Welcome to Appium v1.6.5
- [info] [Appium] Appium REST http interface listener started on 0.0.0.0:4723[info] [HTTP] --> POST /wd/hub/session {"capabilities":{"firstMatch":[],
- "alwaysMatch":{"platformName":"Android","platformVersion":"6.0.1","deviceName":"KIW-AL10","app":"C:\\Users\\Administrator\\PycharmProjects\\
- appium_android_framework\\app\\shoujibaidu.apk"}},"desiredCapabilities":{"platformName":"Android","platformVersion":"6.0.1",
- "deviceName":"KIW-AL10","app":"C:\\Users\\Administrator\\PycharmProjects\\appium_android_framework\\app\\shoujibaidu.apk"}}
- [debug] [MJSONWP] Calling AppiumDriver.createSession() with args: [{"platformName":"Android","platformVersion":"6.0.1",
- "deviceName":"KIW-AL10","app":"C:\\Users\\Administrator\\PycharmProjects\\appium_android_framework\\app\\shoujibaidu.apk"},null,{"firstMatch":[],
- "alwaysMatch":{"platformName":"Android","platformVersion":"6.0.1","deviceName":"KIW-AL10","app":"C:\\Users\\Administrator\\PycharmProjects\\
- appium_android_framework\\app\\shoujibaidu.apk"}}]
- [debug] [BaseDriver] Event 'newSessionRequested' logged at 1504948606634 (17:16:46 GMT+0800 (中国标准时间))
- [info] [Appium] Creating new AndroidDriver (v1.20.0) session
- [info] [Appium] Capabilities:
- [info] [Appium] platformName: 'Android'
- [info] [Appium] platformVersion: '6.0.1'
- [info] [Appium] deviceName: 'KIW-AL10'
- [info] [Appium] app: 'C:\\Users\\Administrator\\PycharmProjects\\appium_android_framework\\app\\shoujibaidu.apk'
- [debug] [AndroidDriver] AndroidDriver version: 1.20.0
- [info] [BaseDriver] Session created with session id: f61bbf84-4eba-4500-b3f3-5a810117e323
- [debug] [AndroidDriver] Getting Java version[info] [AndroidDriver] Java version is: 1.8.0_121
- [info] [ADB] Checking whether adb is present
- [info] [ADB] Using adb.exe from C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe
- [info] [AndroidDriver] Retrieving device list
- [debug] [ADB] Trying to find a connected android device
- [debug] [ADB] Getting connected devices...[debug] [ADB] 1 device(s) connected
- [info] [AndroidDriver] Looking for a device with Android '6.0.1'
- [debug] [ADB] Setting device id to WPV0216912000686
- [info] [ADB] Getting device platform version
- [debug] [ADB] Getting connected devices...
- [debug] [ADB] 1 device(s) connected