?
是一个移动端的自动化测试框架,可用于测试原生应用,移动网页应用和混合型应用,
而且是跨平台的。
?
本地应用是指使用
android
或
ios
的
sdk
编写应用;
?
移动网页应用是指类似于网页应用的网页应用
ios
中
safari
应用或者
Chrome
应用或者类
浏览器览器;
?
介于混合应用
web-app
和
native-app
之间的应用。
?
Appium
是模拟人的操作进行功能自动化,通常用于功能测试和兼容性测试。
?
第一条采用底层驱动提供的自动化框架。
?
IOS
?
苹果的
UIAutomation
?
Android 4.2
?
谷歌的
UiAutomator
?
第二条使用底层驱动提供统一
API
,就是
WebDriver API
。
?
WebDriver(
也称
Selenium WebDriver)
其实是一个
C/S
架构协议称为
JSON Wire
Protocol
。通过本协议,客户端可以发送任何语言
HTTP
请求给服
服务器。这意味着您可以自由选择您想要使用的测试框架和执行器,也可以使用任何
包含
HTTP
将客户端的库文件添加到您的代码中。换句话说,
Appium
的
WebDriver
不是技术测试框架,而是自动化库。
?
第三条:在
WebDriver
的基础上,扩展了一些适合移动端自动化协议的
API
。
核心是
web
服务器
它接受客户端的连接,接收客户端的命令,在手机设备上执行命令,然后通过
HTTP
的响应收集命令执行的结果。
Session
自动化的过程通常在
session
上下文中执行。
客户端初始化一个
session
会话,虽然不同的语言初始化的方式不同,但是他们
都要发送
POST/session
请求到服务器端,这些请求里面都会带有一个对象:
desiredCapabilities
,这个时候服务器端会启动自动化
session
然后返回一个
session
ID
,以后的命令都会用这个
seesion ID
去匹配。
Desired Capabilities
desired capabilities
对象其实是一个
key-value
的集合,里面包含了各种各样的信
息,发送到服务器端后,服务器解析这些信息就知道了客户端对哪种
session
感
兴趣,然后就会启动相应的
session
。
这里面的信息会影响着服务器端启动
session
的类型。比如你
platformName
的值
为
ios
,就是告诉服务器启动一个
ios
的
session
,而不是
android seesion
,之后使
用
js
打开新窗口。
Appium Server
Appium
是一个用
Node.js
编写的
HTTP server
,它创建、并管理多个
WebDriver
sessions
来和不同平台交互,如
iOS
,
Android
等。
Appium Clients
Appium
开始一个测试后,就会在被测设备(手机)上启动一个
server
,监听来
自
Appium server
的指令,每种平台(如
iOS
和
Android
)都有不同的运行和交
互方式,所以
Appium
会用某个桩程序“侵入”该平台,并接受指令,来完成测
试用例的运行。
客户端的概念不是我们传统意义上的客户端,这里客户端更好的理解是一个扩展
WebDriver
协议的库,你在用自己喜欢的语言写
case
的时候,将该语言扩展
WebDrvier
的库添加到你的环境中,你就可以理解这是个客户端。
Appium
在不同平台中使用了标准的自动化
APIs
,所以在跨平台时,不需要重新编译
或者修改自己的应用。
Appium
实现了真正的跨平台自动化测试。
Appium
支持
Selenium WebDriver
支持的所有语言,如
java
、
Object-C
、
JavaScript
、
Php
、
Python
、
Ruby
、
C#
、
Perl
语言,更可以使用
Selenium WebDriver
的
Api
。
Appium
支持任何一种测试框架。
安装
node.js
是一个
Javascript
运行环境(
runtime environment
)。
安装
.NET framework
软件名形如
NDP...
.net framework
是微软的开发程序的框架,用
.net
开发的程序就需要
.net
的环境来
支持才能运行。
安装
vc_redist
VisualC++
的运行时库,包含了一些
VisualC++
的库函数。
如果缺少,会导致
sdk
运行异常。
计算机中如果安装过,可以忽略此步。
安装
jdk
并配置环境变量
安装
android sdk
SDK
(
software development kit
)是一个
Android
开发环境。
需要
JDK
。
安装工具包和手机操作系统
安装工具包和测试所需要的操作系统
system image
armeabi
第
5
代、第
6
代
ARM
处理器,早期的手机用的比较多。
armeabi-v7a
第
7
代
ARM
处理器。
arm64-v8a
第
8
代
64
位
ARM
处理器。
x86
平板、模拟器用得比较多。
需要计算机是
Intel Cpu
,且支持
Intel-V
。
x86_64
64
位的平板。
设置
Android
环境变量
ANDROID_HOME
:
e:\android\android-sdk
PATH
:
;%ANDROID_HOME%\platform-tools
adb.exe
所在目录
创建模拟器
使用
avd manager
(
android virtual device
)进行模拟硬件设备
选择合适的系统镜像
使用模拟器说明
虚拟机上运行模拟器可能导致运行缓慢
建议在真机系统行运行模拟器
打开
avd manager
创建模拟器
尽量选择低分辨率的“
Device
”
启动模拟器
上图中点击
Statrt
,即可启动
每次执行测试前,应确保模拟器处于运行状态
过程较慢,启动完成后,可查看、可关闭
安装
Appium
进行后续测试之前必须启动
Appium
。
appium
下载地址
https://github.com/appium/appium-desktop/releases/
在基础环境上继续安装。
eclipse
构建路径,导入如下包入库(注意版本需要匹配)
java-client-*.jar
下载地址
https://mvnrepository.com/artifact/io.appium/java-client
selenium-server-standalone-*.jar
testng-6.14.zip
TestNG
是一个开源自动化测试框架,
TestNG
表示下一代。
用于设置测试前的准备代码,测试代码,测试完毕后的处理代码。
离线安装。
测试类自行命名,只要符合标识符命名规则即可。
定义
AppiumDriver
对象
public class AppTest {
AppiumDriver driver;
}
用于设定进入测试类后,在所有测试之前首先要执行的代码。
必须先创建
AppiumDriver
对象
@BeforeClass
public void setup() throws Exception {
//
创建
DesiredCapabilities
对象
//
指定测试平台
//
指定程序名称
//
指定启动页名称
}
创建
DesiredCapabilities
对象
DesiredCapabilities device=new DesiredCapabilities();
用于指定测试设备信息
指定测试设备平台
device.setCapability("deviceName"
,
"Android Emulator");
使用的移动设备或模拟器的种类,如
iPhone Simulator
,
iPad Simulator
,
Android Emulator
,
Galaxy S4
等
device.setCapability("platformName"
,
"Android");
指定使用哪个移动操作系统平台,如
iOS
,
Android
或
FirefoxOS
device.setCapability("platformVersion"
,
"4.4.2");
指定移动操作系统版本
指定
app
程序包名,即被测程序名
如
device.setCapability("appPackage"
,
"com.android.calculator2");
如何探测程序名
打开并进入软件
通过
\Android\android-sdk\tools\uiautomatorviewer.bat
去探测,
package
后面的
文字即程序名。
若
cmd
窗口下出现
Unable to detect adb version
错误
检查
path
环境变量:
PATH
:
;%ANDROID_HOME%\platform-tools
指定
app
启动页名称
device.setCapability("appActivity"
,
".Calculator");
启动页的名字,类似于窗口名。
打开
APP
→执行
adb logcat>D:/log.txt
→ 胡乱的对
APP
做一些操作→
Ctrl+C
结束
adb
命令→打开
log.txt
文件,搜索:
Displayed
,“
/”
左边的
是包名,右边是
Activity
。
启动
App
driver = new AndroidDriver(new URL("http://localhost:4723/wd/hub")
,
device);
wd
是
WebDriver
的缩写
hub
指主(中心)节点,
selenium
分布式里的中心节点
运行方式→
TestNG Test
注意启动
Appium
。
测试方法需要加
@Test
才能运行。
在所有测试之后再执行的代码。
退出
App
driver.quit()
@AfterClass
public void tearDown() {
driver.quit()
}
指定要测试的方法,方法名只要符合标识符命名规则。
属性
description="
测试描述
"
priority=
优先级,从
0
开始
timeout=?ms
,超时时间
dataProvider="Dataprovider
的名称或方法名
"
dataProviderClass=
产生测试数据的类
@Test
public void plus(){
}
driver.findElementById(resource-id
属性
)
driver.findElementByClassName(class
属性
)
driver.findElementBy?(
属性
).sendKeys("
数据
")
driver.findElementBy?(
属性
).clear()
driver.findElementBy?(
属性
).click()
driver.findElementBy?(
属性
).getText()
写法类似于正则表达式,使用更方便。
Boolean rs=driver.findElementById(…).getText().contains( );
Assert.assertTrue(rs);
用于测试期望结果的断言,即测试两个对象是否相等。
String actual=
实际结果
;
String expected=
预期结果
;
Assert.assertEquals(actual, expected);
String res=driver.findElementByClassName("android.widget.EditText").getText();
Assert.assertEquals(res
,
"3");
driver.pressKeyCode(keycode)
必须使用
AmdroidDriver
KEYCODE_0
按键
'0' 7
KEYCODE_1
按键
'1' 8
KEYCODE_2
按键
'2' 9
KEYCODE_3
按键
'3' 10
KEYCODE_4
按键
'4' 11
KEYCODE_5
按键
'5' 12
KEYCODE_6
按键
'6' 13
KEYCODE_7
按键
'7' 14
KEYCODE_8
按键
'8' 15
KEYCODE_9
按键
'9' 16
KEYCODE_A
按键
'A' 29
KEYCODE_B
按键
'B' 30
KEYCODE_C
按键
'C' 31
KEYCODE_D
按键
'D' 32
KEYCODE_E
按键
'E' 33
KEYCODE_F
按键
'F' 34
KEYCODE_G
按键
'G' 35
KEYCODE_H
按键
'H' 36
KEYCODE_I
按键
'I' 37
KEYCODE_J
按键
'J' 38
KEYCODE_K
按键
'K' 39
KEYCODE_L
按键
'L' 40
KEYCODE_M
按键
'M' 41
KEYCODE_N
按键
'N' 42
KEYCODE_O
按键
'O' 43
KEYCODE_P
按键
'P' 44
KEYCODE_Q
按键
'Q' 45
KEYCODE_R
按键
'R' 46
KEYCODE_S
按键
'S' 47
KEYCODE_T
按键
'T' 48
KEYCODE_U
按键
'U' 49
KEYCODE_V
按键
'V' 50
KEYCODE_W
按键
'W' 51
KEYCODE_X
按键
'X' 52
KEYCODE_Y
按键
'Y' 53
KEYCODE_Z
按键
'Z' 54
功能键
KEYCODE_CALL
拨号键
5
KEYCODE_ENDCALL
挂机键
6
KEYCODE_HOME
按键
Home 3
KEYCODE_MENU
菜单键
82
KEYCODE_BACK
返回键
4
KEYCODE_SEARCH
搜索键
84
KEYCODE_CAMERA
拍照键
27
KEYCODE_FOCUS
拍照对焦键
80
KEYCODE_POWER
电源键
26
KEYCODE_NOTIFICATION
通知键
83
KEYCODE_MUTE
话筒静音键
91
KEYCODE_VOLUME_MUTE
扬声器静音键
164
KEYCODE_VOLUME_UP
音量增加键
24
KEYCODE_VOLUME_DOWN
音量减小键
25
控制键
KEYCODE_ENTER
回车键
66
KEYCODE_ESCAPE ESC
键
111
KEYCODE_DPAD_CENTER
导航键 确定键
23
KEYCODE_DPAD_UP
导航键 向上
19
KEYCODE_DPAD_DOWN
导航键 向下
20
KEYCODE_DPAD_LEFT
导航键 向左
21
KEYCODE_DPAD_RIGHT
导航键 向右
22
KEYCODE_MOVE_HOME
光标移动到开始键
122
KEYCODE_MOVE_END
光标移动到末尾键
123
KEYCODE_PAGE_UP
向上翻页键
92
KEYCODE_PAGE_DOWN
向下翻页键
93
KEYCODE_DEL
退格键
67
KEYCODE_FORWARD_DEL
删除键
112
KEYCODE_INSERT
插入键
124
KEYCODE_TAB Tab
键
61
KEYCODE_CAPS_LOCK
大写锁定键
115
KEYCODE_BREAK Break/Pause
键
121
KEYCODE_SCROLL_LOCK
滚动锁定键
116
KEYCODE_ZOOM_IN
放大键
168
KEYCODE_ZOOM_OUT
缩小键
169
组合键
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right