appium是开源的移动端自动化测试框架,能够测试ios,android应用。appium让移动端自动化测试没必要限定在某种语言和某个具体的框架;也就是说任何人均可以使用本身最熟悉最顺手的语言以及框架来作移动端自动化测试,支持java/python/Ruby等语言。html
appium的技术架构java
OS: Apple's UIAutomationnode
Android 4.2+: Google's UiAutomatorpython
Android 2.3+: Google's Instrumentationandroid
appium原理ios
Client/Server Architecturegit
appium的核心实际上是一个暴露了一系列REST API的server。web
这个server的功能其实很简单:监听一个端口,而后接收由client发送来的command。翻译这些command,把这些command转成移动设备能够理解的形式发送给移动设备,而后移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。npm
在这里client其实就是发起command的设备,通常来讲就是咱们代码执行的机器,执行appium测试代码的机器。狭义点理解,能够把client理解成是代码,这些代码能够是java/ruby/python/js的,只要它实现了webdriver标准协议就能够。json
这样的设计思想带来了一些好处:
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)