Appium使⽤教程_Android篇
⼀、Appium介绍
Appium是⼀个开源的⾃动化测试⼯具,其⽀持iOS和安卓平台上的原⽣的,基于移动浏览器的,混合的应⽤。
1、Appium 理念
Appium是基于以下的四个理念设计来满⾜移动平台测试⾃动化的要求的:
1)您不应该因为需要⾃动化测试您的应⽤⽽不得不以任何形式去重新编译或者修改你的app
2)您不应该把⾃⼰固定在⼀门特定的语⾔和⼀个特定的框架上去实现和运⾏你的测试
3)当说到测试⾃动化APIs的时候,⼀个移动测试框架不应该做“重新发明轮⼦”的事情,
4)⼀个移动测试⾃动化框架应该是开源的,⽆论是在精神上,实际上,还是名义上!
2、使⽤Appium进⾏⾃动化测试有两个好处
Appium在不同平台中使⽤了标准的⾃动化APIs,所以在跨平台时,不需要重新编译或者修改⾃⼰的应⽤。
Appium⽀持Selenium WebDriver⽀持的所有语⾔,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl 语⾔,更可以使⽤Selenium WebDriver的Api。Appium⽀持任何⼀种测试框架.Appium实现了真正的跨平台⾃动化测试。(本⽂主要介绍Python的⽤法)
3、Appium架构
Appium 是⼀个⽤Node.js编写的HTTP server,它创建、并管理多个 WebDriver sessions 来和不同平台交互,如 iOS ,Android等等.
Appium 开始⼀个测试后,就会在被测设备(⼿机)上启动⼀个 server ,监听来⾃ Appium server的指令. 每种平台像 iOS 和Android 都有不同的运⾏、和交互⽅式。所以Appium会⽤某个桩程序“侵⼊”该平台,并接受指令,来完成测试⽤例的运⾏。
⼆、Appium环境搭建(Android)
1、⾸先需要准备
1) jdk(步骤不再啰嗦)
选择Python版本的Lib: Appium-Python-Client-0.
上述软件都准备好后,则进⼊搭建步骤。
2、安装、配置
将上述软件依次安装。
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,检查是否设置成功,如下图:
三、开始例⼦(Python)
1) 启动Appium
打开命令⾏,输⼊appium, 显⽰成功启动:
2)连接Android⼿机(或者模拟器)
3)编写客户端代码
假设我们的代码放在⽬录E:\PythonTest\AppiumClientPython 中。⾸先把 Appium-Python-Client-0. ⾥⾯的 appium ⽬录解压到AppiumClientPython 中, 把 selenium-2.53.⾥⾯的 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'
android学习教程
driver = webdriver.Remote('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()
4)运⾏
打开命令⾏,cd到E:\PythonTest\AppiumClientPython 中,运⾏ python hello_appium.py, 正常情况可以看到⼿机按照代码控制,打开计算器,逐个点击按钮完成计算。
四、Appium⽂档
1、安装应⽤后打开
import os
from appium import webdriver
APK_PATH = 'apk/ECloud-debug.apk'
COMMAND_EXECUTOR_URL = '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)
2、查控件
1)通过名称查
btn = driver.find_element_by_name("+")
2)  通过ID查
start_btn =driver.find_element_by_id('loud:id/instruction_close_btn')
或 start_btn = driver.find_element_by_id('instruction_close_btn')
3)通过类名查
child_text =parent.find_element_by_class_name('android.widget.TextView')
4)通过android_uiautomator查
start_btn =driver.find_element_by_android_uiautomator('new UiSelector().clickable(true)')
以上find_element_by_XX 都是返回符合条件的第⼀个控件,如果要返回多个控件,可以调⽤ find_elements_by_XX, 返回的是⼀个list。注意:如果不到符合条件的控件,会抛出异常。
5)查结点,不希望返回异常,写个函数就⾏了
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
3、模拟按钮点击
login_btn.click()
注意:有的点击如果需要等待动画、或者⽹络请求,建议等待⼀会:
import time
time.sleep(2)  # 睡眠2秒
4、输⼊框输⼊⽂本
user_input.send_keys('123456')
注意:Android如果要正确输⼊,需要把使⽤系统⾃带的输⼊法,第三⽅输⼊法⽆法正确输⼊。
5、模拟点击返回键
driver.press_keycode(4)
其中按钮的定义,由Android⾥的KeyEvent.java⾥定义的,所以其它的Android按钮也是⽀持的。
6、关闭driver
driver.quit()
注意:⼀定要记得关闭driver, 否则下次连接的时候可能会出异常,因为Appium以为你上次未关闭,会创建Session失败。为了避免代码出现异常⽽没有关闭,可以在捕获异常时再关闭。
7、滑动界⾯
下⾯的例⼦,演⽰点击屏幕中间,并向上拉动(相当于查看列表下⾯的内容了)。
from uch_action import TouchAction
def test_scroll_down(driver):
screen = _window_size()
action = TouchAction(driver)
action.press(x=screen['width']/2,y=screen['height']/2)
action.perform()
等等,怎么获取界⾯的属性来验证正确性?
8、获取界⾯属性,控件属性
1)获取当前Activity名称
activity = driver.current_activity
2) 获取屏幕宽⾼
screen = _window_size()
3)获取控件⽂本
_attribute('text') 或者
4)获取控件类名
_attribute('className')
5)判断控件是否显⽰
mobile_name.is_displayed() 或者 _attribute('displayed')
6)获得控件位置
mobile_name.location
7)获得控件⼤⼩
mobile_name.size
8)查控件⼦结点
parent.find_elements_by_class_name('android.widget.TextView')
同样:查控件的其它⽅法,也适⽤于查⼦结点。
对于交互后的验证,⽆法验证到具体的数据内容,可以验证当前的Activity,或者⽂本,或者列表是否为空等等。
五、结合单元测试框架编写⽤例
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个⽤例不通过。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。