我的Appium学习记录——从搭建环境到一个简单Android App测试实例

本文简单记录了我的Appium入门学习历程。系统环境为Win7 x64,Appium client选择Python,Python版本为2.7。那就开始吧。

环境的搭建

1. JDK

到Oracle官网下载,我安装的是8u121 x64版本。

安装完,添加环境变量:JAVA_HOME,值:JDK安装的路径,如C:\Program Files\Java\jdk1.8.0_121

修改环境变量Path,发现好像不用改了,因为安装JDK的时候已经加上了C:\ProgramData\Oracle\Java\javapath,所以没有按网上的教程做(在原来的末尾加上分号”;”,再加上%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

再添加环境变量:CLASSPATH,变量值:%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

2. Appium + node.js

由于用的是Windows系统,Appium给Windows用户做了一个“一键安装包”——AppiumForWindows,到官网http://appium.io/下载即可。里面带了Appium和node.js。安装之后在环境变量Path中再加上Appium(也是node)所在的路径。

3. Android SDK

Google Developers下载,我这里给出的是google.cn的网址(有了.cn的网站,稍微方便了国内开发者),我不需要装庞大的Android Studio,所以我没有下载Android Studio,只到页面的最下方下载了“仅获取命令行工具”,即SDK工具包。

下载完解压到任意目录如D:\android-sdk,然后添加环境变量:ANDROID_HOME,值:D:\android-sdk;修改Path环境变量,增加:%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools

然后与运行位于%ANDROID_HOME%\tools\lib\下的SDK Manager.exe,可能会出错,如果报错了,就把该目录下的SDK Manager.exe和AVD Manager.exe复制到%ANDROID_HOME%下,再运行SDK Manager.exe,如图:

下面默认勾的System Image我不需要(我不用虚拟机),所以去掉;默认选择的SDK Tools、SDK Platform-tools、SDK Build-tools保留,开始下载。

下载、安装完之后,你的%ANDROID_HOME%应该是这样子的:

Appium的基础就装好了。运行Appium目录下的node_modules\.bin\appium-doctor.cmd,可以给你的系统环境做个检查,一切正常:

4. Python

我选择使用Python开发。到Python的官网下载安装,2.7或者3.5、3.6版本均可,看喜好吧,公司还是Python 2,所以我只能选2.7。除了Python,Appium还支持Java、C#、JavaScript、PHP、Ruby等开发。

5. 对应语言的Appium库

例如Python对应的是Appium-Python-Client,在cmd中执行pip install Appium-Python-Client安装。

装完后,在python中输入from appium import webdriver,尝试import一下,如果正常就说明终于把环境装好了。

 

实机测试

1. 无线adb调试

之前一直以为Android手机的USB Debug只能有线Debug,后来才知道可以无线,无线连接是方便很多,但是速度可能会慢一点,也会受周边环境的影响,看情况选择吧。

先把手机通过USB连接PC,手机开启USB调试,装好驱动什么的之后,在cmd中执行:

adb tcpip 5555    # 端口号
adb connect 192.168.1.123   # Android设备的IP地址,
adb devices

查看是否已连接手机(如正常会显示IP和端口)。如果想用回USB模式,可执行adb usb。

2. 获得包名、Activity名和控件的信息

我们在接下来的开发中,要指定开启的App的包名,本文以打开自带的计算器,计算1+1=2为例,手上有一台LG的样机,先手动打开计算器的App。然后,在电脑运行%ANDROID_HOME%\tools\uiautomatorviewer.bat。

点击左上角的第二个或第三个按钮,UI Automator Viewer就会从手机获取当前的画面,并分析,如图:

从图中可知,package的名字是com.android.calculator2,这个记下来,等一下会用到。

鼠标可以在预览图中选择,可以在右边看到对应控件的一些信息,是我们稍后进行自动化开发需要用到的,例如:数字1的resource-id是com.android.calculator2:id/digit1,按键”+”的resource-id是com.android.calculator2:id/plus,按键”=”的resource-id是com.android.calculator2:id/equal。

最后,就差获取Activity名了。Appium如果想启动一个已安装的App,就必须提供Activity名;如果不提供Activity名,那么就要提供本地的apk路径(会传到手机安装吧,我没试过)。我们日常使用Android手机时,直接点击,不需要知道什么Activity就能开App了啊——那是因为apk的AndroidManifest.xml里面有指定Activity了。

我的App已经装好了,也不想每次都重新装一次App,所以需要获取Activity名。那怎么办呢?方法很多,给出3种办法以供参考:

①找源码,问开发者;
②查日志:a) 在cmd中运行adb logcat > xxx.log
                  b) 在手机打开App
                  c) 在cmd中按ctrl-c停止
                  d) 在xxx.log查找”package名/”,后面跟的就有Activity,不过可能会找到很多个,要自己过滤一下
③先在手机上运行App,再在cmd中执行“adb shell dumpsys window windows”,然后看mFocusedApp这一行的内容,我试过一些不同的App,有一些得出的Activity填到Appium之后,提示不能Launch,但是也可以试试,毕竟比②简单。

终于获得了足够的信息,可以开始写第一个脚本了。

3. 写代码

重申,本文用的都是Python,如果是其他语言,可以参照文档,作相应修改。
首先,先把appium import进来:

from appium import webdriver

然后,定义Desired Capabilities。
Desired Capabilities是什么?Desired Capabilities在启动session的时候是必须提供的,是为了告诉Appium Server一些必要的信息,并做一些参数的配置。

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = 'LG G4'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'

以上定义了5个值,一看就懂,就不具体解释了,如果想知道更多有关Desired Capabilities的资料可以参考官方文档
接下来就可以启动了:

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# webdriver.Remote实际上就是原生selenium webdriver的子类
# 新建driver的时候必须要指定一个Desired Capabilities对象

之后就是一些操作,以计算1+1=2为例:

driver.find_element_by_id('com.android.calculator2:id/digit1').click()
driver.find_element_by_id('com.android.calculator2:id/plus').click()
driver.find_element_by_id('com.android.calculator2:id/digit1').click()
driver.find_element_by_id('com.android.calculator2:id/equal').click()

driver.quit()   # 最后记得退出

至此,入门的脚本就写完了,顺利地踏出了第一步。

下面是我接触Appium几天学到的一点点经验。

 

我的一些经验

1. 修改等待超时

默认情况下,如果60s内不操作,整个session就会被结束掉,App也会退了,根据Desired Capabilities的文档,有一个newCommandTimeout的参数,例如我给它设定为3600,就是1小时。

2. 一些其他操作

刚才只用了click()方法,还有很多其他的方法,例如滑动、按键、切后台、锁屏、截图等,可参考官方文档

3. 定位

上面的例子里面是用resource-id来定位的,用的是get element by id方法。除此之外,还有其他的定位方式,例如by name、by class等。而同一个id/class也可能被不止一个的控件使用,这个时候可能就需要用get elements by xx来返回全部然后再选择操作。

4. 每次都要装appium settings和unlock两个程序

这个也是挺麻烦的,每次都会提示安装,需要手动点击,搜索了一下可以通过改文件解决。我用的版本改的是(Appium安装目录)\Appium\node_modules\appium\lib\devices\android\android.js,注释this.pushSettingsApp.bind(this),和this.pushUnlock.bind(this),这两行即可。

5. 完全关闭App

用close_app()方法似乎不能真正地关掉程序,效果就像是按了Home键一样,网络传输仍在后台进行;而我想要杀进程的效果。后来发现还是要借助adb命令(am force-stop),关闭的效果才比较彻底。

 

一些参考:

  1. http://www.cnblogs.com/nbkhic/tag/appium/
  2. http://wenku.baidu.com/view/942cb55a51e79b8969022618.html

已有2条评论 发表评论

  1. 测试小秦 /

    大神,有没有appium-desktop+安卓手机的教程呢?

    1. Demi /

      流程上是一样的,通过adb连接手机与电脑后,adb devices获取到当前连接到的中虚拟机名称,而后在代码中将相关设备配置信息更改一下就可以了

发表评论