Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用。html
Appium是基于如下的四个理念设计来知足移动平台测试自动化的要求的:java
1)您不该该由于须要自动化测试您的应用而不得不以任何形式去从新编译或者修改你的appnode
2)您不该该把本身固定在一门特定的语言和一个特定的框架上去实现和运行你的测试python
3)当说到测试自动化APIs的时候,一个移动测试框架不该该作“从新发明轮子”的事情,android
4)一个移动测试自动化框架应该是开源的,不管是在精神上,实际上,仍是名义上!git
Appium在不一样平台中使用了标准的自动化APIs,因此在跨平台时,不须要从新编译或者修改本身的应用。github
Appium支持Selenium WebDriver支持的全部语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可使用Selenium WebDriver的Api。Appium支持任何一种测试框架.Appium实现了真正的跨平台自动化测试。(本文主要介绍Python的用法)web
Appium 是一个用Node.js编写的HTTP server,它建立、并管理多个 WebDriver sessions 来和不一样平台交互,如 iOS ,Android等等. 浏览器
Appium 开始一个测试后,就会在被测设备(手机)上启动一个 server ,监听来自 Appium server的指令. 每种平台像 iOS 和Android都有不一样的运行、和交互方式。因此Appium会用某个桩程序“侵入”该平台,并接受指令,来完成测试用例的运行。网络
1) jdk(步骤再也不啰嗦)
2) android SDK,下载地址:http://developer.android.com/sdk/index.html,下载sdk tools,可能须要FQ,提供一个国内下载地址:http://www.androiddevtools.cn/
3) appium,下载地址:http://appium.io/
4) nodejs,下载地址:https://nodejs.org/en/
5) appium lib,下载地址:http://appium.io/downloads.html
选择Python版本的Lib: Appium-Python-Client-0.22.tar.gz
因为Appium依赖于Selemium,因此还要下载 Selemium Lib: selenium-2.53.2.tar.gz https://pypi.python.org/pypi/selenium
6) python, 下载地址:https://www.python.org/, 下载2.X 的版本。
上述软件都准备好后,则进入搭建步骤。
将上述软件依次安装。
1) android sdk安装完毕后,须要配置环境变量
新建ANDROID_HOME D:\ProgramFiles (x86)\Android\android-sdk
在PATH中添加:%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
2) nodejs安装完毕后,须要配置环境变量
在PATH中添加:D:\Program Files\nodejs;
3) appium安装完毕后,须要配置环境变量
D:\Program Files (x86)\Appium\node_modules\.bin;
4) 配置好后,启动cmd,
输入node -v,查看node安装版本
输入appium-doctor检查appium的安装环境是否成功,以下图:
5) 安装Python,配置环境变量,如C:\Python27,检查是否设置成功,以下图:
打开命令行,输入appium, 显示成功启动:
假设咱们的代码放在目录E:\PythonTest\AppiumClientPython 中。首先把 Appium-Python-Client-0.22.tar.gz 里面的 appium 目录解压到AppiumClientPython 中, 把 selenium-2.53.2.tar.gz里面的 selenium 目录解压到AppiumClientPython中。
建立文件hello_appium.py , 编辑内容:
#coding=utf-8 from appium import webdriver
desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '4.4.2' desired_caps['deviceName'] = 'Android Emulator' desired_caps['appPackage'] = 'com.android.calculator2' desired_caps['appActivity'] = '.Calculator'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) driver.find_element_by_name("1").click() driver.find_element_by_name("5").click() driver.find_element_by_name("9").click() driver.find_element_by_name("9").click() driver.find_element_by_name("5").click() driver.find_element_by_name("+").click() driver.find_element_by_name("6").click() driver.find_element_by_name("=").click() driver.quit() |
打开命令行,cd到E:\PythonTest\AppiumClientPython 中,运行 python hello_appium.py, 正常状况能够看到手机按照代码控制,打开计算器,逐个点击按钮完成计算。
import os from appium import webdriver APK_PATH = 'apk/ECloud-debug.apk' COMMAND_EXECUTOR_URL = 'http://localhost:4723/wd/hub'
desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '5.0' desired_caps['deviceName'] = 'Android Emulator' desired_caps['app'] = os.path.abspath(APK_PATH)
driver = webdriver.Remote(COMMAND_EXECUTOR_URL, desired_caps) |
btn = driver.find_element_by_name("+")
2) 经过ID查找
start_btn =driver.find_element_by_id('com.cn21.ecloud:id/instruction_close_btn')
或 start_btn = driver.find_element_by_id('instruction_close_btn')
child_text =parent.find_element_by_class_name('android.widget.TextView')
start_btn =driver.find_element_by_android_uiautomator('new UiSelector().clickable(true)')
以上find_element_by_XX 都是返回符合条件的第一个控件,若是要返回多个控件,能够调用 find_elements_by_XX, 返回的是一个list。
注意:若是找不到符合条件的控件,会抛出异常。
def find_element_by_id_no_except(driver, id): element = None try : element = driver.find_element_by_id(id) except Exception,e: print Exception, ':', e return element |
login_btn.click()
注意:有的点击若是须要等待动画、或者网络请求,建议等待一会:
import time time.sleep(2) # 睡眠2秒 |
user_input.send_keys('123456')
注意:Android若是要正确输入,须要把使用系统自带的输入法,第三方输入法没法正确输入。
driver.press_keycode(4)
其中按钮的定义,由Android里的KeyEvent.java里定义的,因此其它的Android按钮也是支持的。
driver.quit()
注意:必定要记得关闭driver, 不然下次链接的时候可能会出异常,由于Appium觉得你上次未关闭,会建立Session失败。
为了不代码出现异常而没有关闭,能够在捕获异常时再关闭。
下面的例子,演示点击屏幕中间,并向上拉动(至关于查看列表下面的内容了)。
from appium.webdriver.common.touch_action import TouchAction def test_scroll_down(driver): screen = driver.get_window_size() action = TouchAction(driver) action.press(x=screen['width']/2,y=screen['height']/2) action.move_to(x=0,y=-screen['height']/10) action.release() action.perform()
|
等等,怎么获取界面的属性来验证正确性?
1)获取当前Activity名称
activity = driver.current_activity
2) 获取屏幕宽高
screen = driver.get_window_size()
3)获取控件文本
mobile_name.get_attribute('text') 或者 mobile_name.text
4)获取控件类名
mobile_name.get_attribute('className')
5)判断控件是否显示
mobile_name.is_displayed() 或者 mobile_name.get_attribute('displayed')
6)得到控件位置
mobile_name.location
7)得到控件大小
mobile_name.size
8)查找控件子结点
parent.find_elements_by_class_name('android.widget.TextView')
一样:查找控件的其它方法,也适用于查找子结点。
对于交互后的验证,没法验证到具体的数据内容,能够验证当前的Activity,或者文本,或者列表是否为空等等。
更多参考:http://blog.csdn.net/crisschan/article/details/50416860
Python自带有unittest用于单元测试,其结构相似于JUnit。
一个测试类须要继承于unittest.TestCase, 方法setUp 用于测试初始化,每一个用例开始前都会调用,tearDown用于用例结束时调用,每一个以test开始的函数被当成一个用例。
test_random.py
import random import unittest
class TestSequenceFunctions(unittest.TestCase):
def setUp(self): self.seq = range(10)
def test_shuffle(self): # make sure the shuffled sequence does not lose any elements random.shuffle(self.seq) self.seq.sort() self.assertEqual(self.seq, range(10))
# should raise an exception for an immutable sequence self.assertRaises(TypeError, random.shuffle, (1,2,3))
def test_choice(self): element = random.choice(self.seq) self.assertTrue(element in self.seq)
def test_sample(self): with self.assertRaises(ValueError): random.sample(self.seq, 20) for element in random.sample(self.seq, 5): self.assertTrue(element not in self.seq)
if __name__ == '__main__': unittest.main(verbosity=2) |
运行此测试: python test_random.py 能够查看测试的结果
上面结果显示,有2个用例测试经过,1个用例不经过。
能够在一个目录下写多个以test开头的测试文件,而后经过如下命令运行全部测试类:
python -m unittest discover . -v
test_ecloud_login_logout.py
#coding=utf-8
|
auto_test_ecloud.py
#coding=utf-8
|
注:为了更方便的编写python代码,推荐使用PyCharm IDE,编辑代码跟Java同样方便。
1)官网 http://appium.io/index.html
2)appium/python-client使用文档https://github.com/appium/python-client
3)搭建appium的android环境http://www.cnblogs.com/qiaoyeye/p/5131382.html
4)Appium移动自动化测试(四)http://www.cnblogs.com/fnng/p/4579152.html
5)AppiumPython API http://blog.csdn.net/crisschan/article/details/50416860
6)appium经常使用方法总结 http://www.cnblogs.com/fanxiaojuan/p/4882676.html