篇2 安卓app自动化测试-初识python调用appium
--lamecho辣么丑
1.1概要
大家好!我是lamecho(辣么丑),上一篇也是《安卓app自动化测试》的第一篇将使用appium的准备环境做了详细的阐述。在文章结尾也提到了本篇将会对appium的相关配置,到连接真机,最后实现一个python小demo,这样本篇就类似于编程的第一课HelloWorld。如何用python连接到appium,实现在手机上对app的操作呢?一切还是以实战为主,今天我将对今日头条这个app做样例,实现一个demo。
1.2 真机连接
在我们的环境准备好后,此刻电脑桌面必有一个Appium的程序图标吧,先别着急点开,欲速则不达。由于是在真机上操作,当然要先把我们的手机准备好吧,啥?你的是苹果机,那你可以有多远那啥多远了。好了手机准备好将其与电脑连上,至于什么打开开发模式之类blabla的话我就不多说了。连接好之后运行-cmd,输入命令 adb devices回车(adb后面有空格)
结果返回如上,有一串数字字母混合的设备编号,表示手机连接正常,然后把这串编号复制一下后面会用到。
1.3 Appium配置连接
将真机成功连上电脑后,打开我们桌面的Appium,如下图
没有什么多余的配置,保持默认就好。如点开齿轮图标,进到设置界面,检查Server Address的地址是 127.0.0.1 Port端口为4723(这些都是默认的)。
然后点开android机器人图标,这里需要我们设置的内容也不多,看到Capabilities里4个配置项里Platform Name:Android;Automation Name : Appium;PlatformVersion:选择之前我们下载的sdk版本是几点几的,上一篇我们下载的是4.2的这里就选4.2就好了。不过我这里选了4.4(貌似不影响运行)。最后是Device Name填写的就是我们刚才通过adb devices命令得到的设备id号。其他的配置项忽略!
这些配置好后,点击界面右上角的三角运行图标,等待服务调起来,如下图。如果环境安装的有问题会报错,或在后面的python脚本运行后会报错,对于具体的报错要看具体的报错信息是什么。Ok步骤到这里,就要开始我们的python脚本编写了。打开我们的python脚本,我用的是PyCharm。
1.4 第一个python脚本
新建python脚本文件后,这里也可以提前把我们要测试的app准备好了。今天我们用今日头条这款app做讲解。虽然我们可以用python脚本直接安装app,但其实在实战里边我们更多的是调取已经安装好的app进行测试(一切以实战为主),当然文章中我会提及在脚本中如何安装app这样的方法。好,运行-cmd 输入adb install app所在目录(手机没断开与电脑的连接吧,用adb devices检查一下)。提醒一下在win10操作系统下,不用手动去打apk的路径,直接将文件拖到窗口里就行了。回车安装apk
等待安装的过程,我们打开python脚本,脚本内容如下:
# -*-coding:utf8-*-
from appium import webdriver
device='4d0041b1be98b01f' #此处设备号
pack='com.ss.android.article.news' #此处是我们app的package名称
activity='com.ss.android.article.news.activity.SplashActivity'#此处是我们的app的主activity
#下面的按照我的脚本内容填写即可,里边内容的意思也很清晰吧
PATH=lambda p:os.path.abspath(os.path.join(os.path.dirname(__file__),p))
desired_caps={}
desired_caps['device'] = 'android'
desired_caps['platformName']='Android'
desired_caps['browserName']=''
desired_caps['Version']='4.4.4'
desired_caps['deviceName']=device
#desired_caps['app']=PATH('D:\\jr.apk')
desired_caps['appPackage'] = pack
desired_caps['appActivity'] = activity
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
接下来重点讲讲我们脚本里几个参数的意思,pack和activity注释里也说了各自的含义,这里主要讲讲如何找到某个app的package和activity的名称。方法有很多,我这里介绍一种相对来说简单容易的,找到我们下载的app的安装包如:jinritoutiao_605.apk,将后缀改成rar压缩文件,然后右键点击打开,找到里边的AndroidManifest.xml文件,点击rar工具的查看按钮,将其打开,然后搜索‘manifest’ ,紧跟其后的就是我们要用的package名称,搜索‘activity’,同样紧跟其后的就是我们的activity名称。
当然其他的查找方法比如,在运行里 adb logcat在日志里去查找(相对麻烦)。或者暴力点找开发人员去问,当然只适合自己公司的产品。毕竟求人不如求己。
接下来替换脚本里你找到的要测试app的package和activity,就可以直接运行我们的脚本文件了。提醒一下,手机要连上电脑,Appium程序要是运行状态,前面的操作提到了。
脚本运行起来后,如果程序,环境都正常手机上会将今日头条启动起来,我们的脚本内容也就是到此为止,因为脚本中没有加任何操作,只是到启动app。如果有报错,查看Appium里的日志,分析报错原因。好了,脚本运行成功后可以查看我们的手机界面,会多了两个程序,Appium Settings和Unlock。不用管他们,也不要不明所以紧张的删掉这两个程序。讲到这里虽然我们没有在脚本里做任何操作,但是我们离app的自动化测试已经很近了,可以说走过了很大很大的一步。Give me five,祝贺一下!好了回到我们的脚本里,上文提到了如何将app安装在手机上并通过python脚本将其打开的方法,那么如何在手机上通过脚本直接安装一个app呢?看到脚本里注释掉的那句吧“#desired_caps['app']=PATH('D:\\jr.apk')”
Path里放置apk的安装包,这句话就是执行直接安装apk。
写到这里本文也差不多了,不过我们的python的demo还没完,毕竟还要去在app上操作点啥才算完美吧。首先啰嗦几句,python在实现操作点击我们手机上的app都是通过操作app界面上的各个元素,所以第一步当然是怎么找到界面上的元素的问题了。导入appium的webdriver给我提供了比较丰富的查找元素的方法,下一篇我们再具体讲解这些方法及使用。今天我们只实现一个小demo,首先观察一下今日头条的主界面,我们可以做
哪些事情呢?比如说切换标题到热点,然后再点击搜索框进入搜索页面,输入搜索文字,点击搜索按钮,等待搜索结果,直接运行如下脚本。
# -*-coding:utf8-*-
from appium import webdriver
from time import sleep
device='4d0041b1be98b01f' #此处设备号
pack='com.ss.android.article.news' #此处是我们app的package名称
activity='com.ss.android.article.news.activity.SplashActivity'#此处是我们的app的主activity
#下面的按照我的脚本内容填写即可,里边内容的意思也很清晰吧
PATH=lambda p:os.path.abspath(os.path.join(os.path.dirname(__file__),p))
desired_caps={}
desired_caps['device'] = 'android'
desired_caps['platformName']='Android'
desired_caps['browserName']=''
desired_caps['Version']='4.4.4'
desired_caps['deviceName']=device
#desired_caps['app']=PATH('D:\\jr.apk')
desired_caps['appPackage'] = pack
desired_caps['appActivity'] = activity
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
while 1:
if driver.current_activity=='.activity.MainActivity':
break
els=driver.find_elements_by_id('el')
news_t1=els[0].text
print 'news1_title:',news_t1
els=driver.find_elements_by_id('p_')
els[1].click()
while 1:
els=driver.find_elements_by_id('el')
news_t2=els[0].text
print 'news2_title:',news_t2
if news_t2!=news_t1:
break
driver.find_element_by_id('ab0').click()
while 1:
if driver.current_activity=='com.ss.android.article.base.feature.search.SearchActivity':
break
driver.find_element_by_id('ll').send_keys('lamecho')
driver.find_element_by_id('o9').click()
sleep(10)
driver.quit()
怎么样运行效果和我们前面说的操作步骤应该是一致的吧!
至此,我们的app自动化第二篇也要结束了。最后的小demo也体现了python实现自动化运行app的基本逻辑,大家如果在本篇按照我的操作一路走下来也算是在自动化测试上入门了。下一篇,我们将展开app元素这块,可能理论会更多,从如何查找定位元素,到脚本如何实现预设的执行步骤谈起,中间也会穿插一些我的心得体会,让大家对python在实现自动化测试这块少走一些弯路。最后感谢大家耐心读完本篇文章,我是lamecho,辣么丑。
原创文章,转载请注明出处。新浪微博搜索 “lamecho好棒” 欢迎大家来撩。
微博:https://weibo.com/u/6017986584
博客:http://blog.sina.com.cn/u/6017986584