用Appium进行android自动化测试
appium是开源的移动端自动化测试框架,可以测试ios,android应用。appium让移动端自动化测试不必限定在某种语言和某个具体的框架;也就是说任何人都可以使用自己最熟悉最顺手的语言以及框架来做移动端自动化测试,支持java/python/Ruby等语言。
appium的技术架构
OS: Apple's UIAutomation
Android 4.2+: Google's UiAutomator
Android 2.3+: Google's Instrumentation
appium原理
Client/Server Architecture
appium的核心其实是一个暴露了一系列REST API的server。
这个server的功能其实很简单:监听一个端口,然后接收由client发送来的command。翻译这些command,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。
在这里client其实就是发起command的设备,一般来说就是我们代码执行的机器,执行appium测试代码的机器。狭义点理解,可以把client理解成是代码,这些代码可以是java/ruby/python/js的,只要它实现了webdriver标准协议就可以。
这样的设计思想带来了一些好处:
Session
session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。一般来说,通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了。
开启session后,会返回一个全局唯一的session id,以后几乎所有的请求都必须带上这个session id,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。
进一步思考一下,由于session id是全局唯一,那么在同一台机器上启动多个session就变成了可能,这也就是selenium gird所依赖的具体理论根据。
Appium Server
这就是每次我们在命令行用appium命令打开的东西。
Appium Clients
由于原生的webdriver api是为web端设计的,因此在移动端用起来会有点不伦不类。appium官方提供了一套appium client,涵盖多种语言ruby/java/python。在测试的时候,一般要使用这些client库去替换原生的webdriver库。这实际上不是替换,算是client对原生webdriver进行了一些移动端的扩展,加入了一些方便的方法,比如swipe之类,appium client让我们可以更方便的写出可读性更好的测试用例。
Desired Capabilities
Desired Capabilities携带了一些配置信息。从本质上讲,这个东东是key-value形式的对象。你可以理解成是java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。
Desired Capabilities最重要的作用是告诉server本次测试的上下文。这次是要进行浏览器测试还是移动端测试?如果是移动端测试的话是测试android还是ios,如果测试android的话那么我们要测试哪个app? server的这些疑问Desired Capabilities都必须给予解答,否则server不买账,自然就无法完成移动app或者是浏览器的启动。
python里的Desired Capabilities配置:
- from appium import webdriver
- desired_caps = {}
- desired_caps['platformName'] = 'Android'
- desired_caps['deviceName'] = 'myAndroid'
- desired_caps['appPackage'] = 'com.android.calculator2'
- desired_caps['appActivity'] = '.Calculator'
- driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
以上参考http://www.yangyanxing.com/article/1266.html
appium安装
1.先安装node.js。官网下载安装:https://nodejs.org/
2.安装appium。
1)可以通过CMD窗口,执行npm install -g appium 命令来安装Appium
2)也可以直接去appium官网下载安装包来安装。但是可能下不下来,这里给出一个百度网盘的下载链接:http://pan.baidu.com/s/1jGvAISu
安装完成后,将appium可执行文件所在的目录添加到环境变量Path。再通过命令行可以启动appium:
- $appium --session-override --no-reset
--no-reset 即可避免执行用例的时候再次安装app,--session-override 不必每次重启session
appium client安装
主要讲一下python,推荐在线安装:
- $pip install Appium-Python-Client
appium API的使用
以python为例,直接上代码
- #coding:gbk
- from appium import webdriver
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.common.touch_actions import TouchActions
- desired_caps = {}
- desired_caps['platformName'] = 'Android'
- desired_caps['deviceName'] = 'myphone'
- desired_caps['appPackage'] = 'com.android.calculator2'
- desired_caps['appActivity'] = '.Calculator'
- driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
- element_id = "digit1"
- element_text = "2"
- #用find_element_by_id方式查找element,等待20s
- try:
- elm = WebDriverWait(driver, timeout=20, poll_frequency=0.5).until(lambda x: x.find_element_by_id(element_id))
- except Exception, e:
- print e
- #找到elm后点击
- if elm:
- elm.click()
- #通过控件id获取控件text
- Text = elm.get_attribute("text")
- if Text:
- print Text
- #用find_element_by_name方式查找element,等待20s
- try:
- elm1 = WebDriverWait(driver, timeout=20, poll_frequency=0.5).until(lambda x: x.find_element_by_name(element_text))
- except Exception, e:
- print e
- #获得当前activity
- act = driver.current_activity
- #通过TouchActions类绘制折线
- try:
- grid = WebDriverWait(driver, timeout=20, poll_frequency=0.5).until(lambda x: x.find_element_by_id('panelswitch'))
- except Exception, e:
- print e
- #控件grid的大小和位置
- width = grid.size['width']
- height = grid.size['height']
- x1 = grid.location['x']
- y1 = grid.location['y']
- #绘制折线
- action = TouchActions(driver)
- action.tap_and_hold(x1+width/8,y1+height/8).move(x1+width/8+width/3.4, y1+height/8).move(x1+width/8+width/3.4,y1+height/8+height*0.8).release(x1+width/8+width/3.4,y1+height/8+height*0.8)
- action.perform()
- #发送键盘事件,4表示返回键,更多见http://blog.csdn.net/wxlinwzl/article/details/41775333
- driver.keyevent(4)
- #获取屏幕长宽
- width = driver.get_window_size()['width']
- height = driver.get_window_size()['height']
- #滑动
- driver.swipe(width/2, 10, width/2, height/2)
用Appium进行android自动化测试的更多相关文章
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- 用Appium让Android功能自动化测试飞起来
前言 做Android端功能自动化已有2年多的时间了,使用过的功能自动化框架有Robotium.Uiautomator.Appium.最近研究自动化case复用的方案,调研了Appium的自动化框架, ...
- 【Mac + Appium + Python3.6学习(五)】之常用的Android自动化测试API总结
Github测试样例地址:https://github.com/appium-boneyard/sample-code/tree/master/sample-code/examples ①定位text ...
- Appium做Android功能自动化测试
前言 做Android端功能自动化已有2年多的时间了,使用过的功能自动化框架有Robotium.Uiautomator.Appium.最近研究自动化case复用的方案,调研了Appium的自动化框架, ...
- Android自动化测试框架对比
1.Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作:缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限:2.Rubotium:主要针对某一个APK进行自动化测试,AP ...
- 【亲测】Appium测试Android混合应用时,第二次切换到WebView失败
要解决的问题:Appium测试Android混合应用时,第二次切换到WebView时失败 原因分析:在用Appium测试Android混合应用时,当程序第一次切换到WebView时,可以正常进行自动化 ...
- 如何搭建基于C#和 Appium 的 Android自动测试环境
本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使 ...
- Python appium搭建app自动化测试环境
appium做app自动化测试,环境搭建是比较麻烦的. 也是很多初学者在学习app自动化之时,花很多时间都难跨越的坎. 但没有成功的环境,就没有办法继续后续的使用. 在app自动化测试当中,我们主要是 ...
- Android自动化测试学习路线
最近在整理Android自动化测试的相关资料,大体上把一些知识点梳理了,这里做一个简单的分享! Android里面测试相关的工具和框架太多了.你应该从以下几个方面入手. 编程语言的选择 如果你要学习的 ...
随机推荐
- BZOJ3979 : [WF2012]infiltration
答案是$O(\log n)$级别的,故答案不超过6. 当答案是12345时,暴力枚举+压位检验即可,否则直接输出6. 时间复杂度$O(n^5)$. #include<cstdio> #de ...
- BZOJ 1831 & 就是一个DP....
题意: 比如说,4 2 1 3 3里面包含了5个逆序对:(4, 2), (4, 1), (4, 3), (4, 3), (2, 1). 可惜的是,由于年代久远,这些数字里有一部分已经模糊不清了,为了方 ...
- 获取jQuery对象的第N个DOM元素 && table常用css样式
获取jQuery对象的第N个DOM元素 1.$(selector).get(N-1) 2.$(selector)[N-1] 注意:.index()方法返回的是一个数,相当于C#中的IndexOf() ...
- 设置 tableview 的背景颜色,总是不生效
1.只设置了背景图片,却忘记了取消掉 cell 的背景颜色(可以通过层次结构来观察) UIImageView *bgView = [[UIImageView alloc]initWithFrame:s ...
- ffmpeg解码
解码流程 http://www.cnblogs.com/lidabo/p/4582391.html 例子 http://www.cnblogs.com/lidabo/p/4582393.html
- Linux_解决nohup命令生成的多余的大日志文件
解决nohup命令生成的多余的大日志文件 经常使用命令 nohup /usr/bin/php /srv/www/update.php & 可以让它在后台安静的进行,但是有一个烦恼就是,它会生成 ...
- JDBC学习笔记2
数据库数据更新操作statement接口下操作:[代码] import java.sql.DriverManager;import java.sql.SQLException; public clas ...
- java 深入浅出工厂模式
一.引子 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“ ...
- JavaScript的几种继承方式
看<JavaScript高级程序设计>做的一些笔记 ECMAScript只支持实现继承,不支持接口继承(因为函数没有签名) 原型链(实现继承的主要方法): function SuperTy ...
- Perform UPSERT / INSERT OR UPDATE against a SQLite Database
Option 1: You can afford deleting the row In other words, you don't have foreign key, or if you have ...