第一章 基于
Java
语言的
Appium
的使用
一、
Appium
简介
1
什么是
Appium
是一个移动端的自动化测试框架,可用于测试原生应用,移动网页应用和混合型应用,
且是跨平台的。
原生的应用是指用
android
或
ios
的
sdk
编写的应用;
移动网页应用是指网页应用,类似于
ios
中
safari
应用或者
Chrome
应用或者类
浏览器的应用;
混合应用是介于
web-app
和
native-app
之间的应用。
Appium
是模拟人的操作进行功能自动化,通常用于功能测试和兼容性测试。
2 Appium
的设计
第一条:采用底层驱动商提供的自动化框架。
IOS
苹果的
UIAutomation
Android 4.2+
谷歌的
UiAutomator
第二条:采用底层驱动商提供统一
API
,就是
WebDriver API
。
WebDriver(
也称
Selenium WebDriver)
其实是一个
C/S
架构的协议,叫做
JSON Wire
Protocol
。通过这个协议,用任何语言写成的客户端都可以发送
HTTP
请求给服
务器。这就意味着可以自由选择你想要使用的测试框架和执行器,也可以将任何
包含
HTTP
客户端的库文件加入到你的代码中。换句话说,
Appium
的
WebDriver
不是一个技术上的测试框架,而是一个自动化库。
第三条:在
WebDriver
的基础上,扩展了一些适合移动端自动化协议的
API
。
3 Appium
的原理
核心是
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
的库添加到你的环境中,你就可以理解这是个客户端。
4 Appium
的优势
Appium
在不同平台中使用了标准的自动化
APIs
,所以在跨平台时,不需要重新编译
或者修改自己的应用。
Appium
实现了真正的跨平台自动化测试。
Appium
支持
Selenium WebDriver
支持的所有语言,如
java
、
Object-C
、
JavaScript
、
Php
、
Python
、
Ruby
、
C#
、
Perl
语言,更可以使用
Selenium WebDriver
的
Api
。
Appium
支持任何一种测试框架。
二、
Appium
环境搭建
1
基础环境
安装
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/
2 Java+Appium
环境
在基础环境上继续安装。
eclipse
构建路径,导入如下包入库(注意版本需要匹配)
java-client-*.jar
下载地址
https://mvnrepository.com/artifact/io.appium/java-client
selenium-server-standalone-*.jar
testng-6.14.zip
TestNG
是一个开源自动化测试框架,
TestNG
表示下一代。
用于设置测试前的准备代码,测试代码,测试完毕后的处理代码。
离线安装。
三、 使用
Java
语言编写测试脚本
1
创建测试类
测试类自行命名,只要符合标识符命名规则即可。
定义
AppiumDriver
对象
public class AppTest {
AppiumDriver driver;
}
2 @BeforeClass
注解
用于设定进入测试类后,在所有测试之前首先要执行的代码。
必须先创建
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
分布式里的中心节点
3
运行测试
运行方式→
TestNG Test
注意启动
Appium
。
测试方法需要加
@Test
才能运行。
4 @AfterClass
注解
在所有测试之后再执行的代码。
退出
App
driver.quit()
@AfterClass
public void tearDown() {
driver.quit()
}
5 @Test(
属性
=
值
)
注解
指定要测试的方法,方法名只要符合标识符命名规则。
属性
description="
测试描述
"
priority=
优先级,从
0
开始
timeout=?ms
,超时时间
dataProvider="Dataprovider
的名称或方法名
"
dataProviderClass=
产生测试数据的类
@Test
public void plus(){
}
6
识别与操作控件元素
driver.findElementById(resource-id
属性
)
driver.findElementByClassName(class
属性
)
driver.findElementBy?(
属性
).sendKeys("
数据
")
driver.findElementBy?(
属性
).clear()
driver.findElementBy?(
属性
).click()
driver.findElementBy?(
属性
).getText()
7
断言
7.1 Assert.assertTrue(boolean
型结果
)
写法类似于正则表达式,使用更方便。
Boolean rs=driver.findElementById(…).getText().contains( );
Assert.assertTrue(rs);
7.2 Assert.assertEquals(
实际结果,预期结果
)
用于测试期望结果的断言,即测试两个对象是否相等。
String actual=
实际结果
;
String expected=
预期结果
;
Assert.assertEquals(actual, expected);
String res=driver.findElementByClassName("android.widget.EditText").getText();
Assert.assertEquals(res
,
"3");
8
模拟按键
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_NUM_LOCK
小键盘锁
143
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
9
参数化
9.1
使用数组返回参数
@DataProvider
public Object[][] getData(){
Object data[][]={ {"234","+","56","290"},
{"256","-","40","216"},
{"3","*","6","18"} };
return data;
}
9.2
使用参数
@Test(dataProvider="getData")
public void
测试方法()
{
}
双引号不能省略。
9.3
使用文件中的数据参数化
@DataProvider(name=?)
public Object[][] getParam() throws Exception{
List<String[]> rows=new ArrayList<String[]>();
File file=new File("C:/.../?.txt");
FileReader reader=new FileReader(file);
BufferedReader buffer=new BufferedReader(reader);
String row=null;
while((row=buffer.readLine())!=null){
String columns[]=row.split("\t");
rows.add(columns);
}
reader.close();
Object[][] data=new Object[rows.size()][];
for(int i=0;i<rows.size();i++)
data[i]=rows.get(i);
return data;
}
9.4
定义获得参数的单独类和方法
public class Param{
@DataProvider(name=?)
public Object[][] getParam() throws Exception{
}
}
使用
@DataProvider(name="
测试数据集名
")
修饰获取参数的方法名。
@Test(dataProvider="getParam",dataProviderClass=
参数类名
.class)
public void
方法名
(
参数列表
){
…
}
参数类名不能加引号。
10
生成测试报告
测试报告默认存储位置
Java
项目名
\test-output
可以自己编写并优化
TestReport.java
测试类中添加监听器
@Listeners({TestReport.class})
即可
class
是固定关键字
放到测试类名的上一行
@Listeners({TestReport.class})
//
监听测试报告类
public class WebTest {
...
}
四、
adb
命令的使用
1
查看
adb
版本
adb version
android debug bridge
即
android
调试桥。
2
显示所有的设备
adb devices
3
安装和卸载
App
adb install .apk
文件名
cmd
下输入
apk
文件名即程序包名,程序名中不要使用汉字。
卸载
App
adb uninstall
完整包名
包名不是
apk
文件名
4
查看手机操作系统的版本号
adb shell getprop ro.build.version.release
5
显示设备中的包以及包的启动项
显示设备中所有的包
adb shell pm list packages
查找某个包
adb shell pm list packages | findstr
查找关键字
查找启动项
adb shell dumpsys activity | findstr "
关键字
"
TaskRecord
后面的内容即为查询到的记录
adb shell dumpsys window w | findstr \/ | findstr name=
需要开启
app
写法最优
6
在指定设备中运行命令
adb -s
设备名
shell
命令
7 adb
服务器的开关
adb start-server
adb kill-server
五、 升级
Appium
1
安装
nodejs
、
NDP
、
vc_redist
、
jdk
NDP
至少
4.7
版。
2
安装
Android Studio
android sdutio
是谷歌推出的一个
Android
集成开发工具。
现已将
SDK
(
software development kit
)集成到
AS
中。
设置
Android
环境变量
ANDROID_HOME
:
e:\android\android-sdk
最好大写,否则可能不被
Appium
识别
PATH
:
;%ANDROID_HOME%\platform-tools
adb.exe
所在目录
3
安装工具包
SDK Manager
设置工具包下载位置。
安装默认的工具包。
4
安装
Appium
默认安装到
C
盘,不可修改安装路径。
六、 模拟器
1 AVD
模拟器
Android
自带模拟器。
1.1
安装测试所需要的操作系统
Intel CPU
下载
Intel
的系统镜像,运行速度可比
ARM
快
10
倍。
下载
HAXM
Intel x86 Emulator Accelerator
1.2
创建模拟器
AVD Manager
可能出错
/dev/kvm is not found
安装低版本
HAXM
1.3
编写测试脚本
查看设备信息
查看设备名
adb devices
查看系统版本
adb shell getprop ro.build.version.release
查看
App
名称和
App
启动项名称
adb shell dumpsys window w | findstr \/ | findstr name=
使用
uiautomatorviewer
发现元素
\Android\sdk\tools\bin\uiautomatorviewer.bat
使用
appium
发现元素
打开
App
设置能力
{
"platformName": "Android",
"deviceName": "Android Emulator",
"platformVersion": "9",
"appPackage": "com.android.calculator2",
"appActivity": ".Calculator",
"automation": "uiautomator2"
}
声明
automation
版本,
AVD
模拟器需要
编写测试脚本
设置
DesiredCapabilities
的属性
DesiredCapabilities devices = new DesiredCapabilities();
devices.setCapability("platformName", "Android");
devices.setCapability("deviceName","
设备名
");
devices.setCapability("platformVersion", "
系统版本如
7.1.2");
devices.setCapability("appPackage","app
包名
");
devices.setCapability("appActivity","app
启动项名
");
devices.setCapability("automation","uiautomator2");
2
夜神模拟器
2.1
硬件要求
建议
CPU
至少
2
核。
2.2
模拟器设置
开机后进行
模拟器分辨率设置
系统设置(齿轮图标)
→
高级设置→分辨率设置
选择
“
手机版
”
修改分辨率大小
查看系统信息
更多操作
(
“三”状图标
)→
系统信息
2.3
创建模拟器
多开模拟器
创建模拟器后会自动下载并安装操作系统
2.4
原生
App
、
Web APP
、混合型
App
NativeApp
即原生
App
,基于本地操作系统运行。
原生
APP
访问和兼容的能力比较好,可以支持在线或者离线消息推送或是进
行本地资源访问、摄像、拨号、蓝牙、功能的调取。
原生
APP
开发有许多的优势,如原生
APP
是针对不同的平台为用户提供不同
的体验、可以节约宽带成本、访问本地资源、打开的速度更快并为用户提供
最佳的用户体验和优质的用户界面等。
每一种移动操作系统都需要独立的
NativeApp
开发项目,
iphone
版本、
Ipad
版本、安卓版本。每种平台都需要独立的开发语言,比如
Java(Android),
Objective-C(iOS)
等。
需要通过应用商店将原生
app
下载到手机上或移动终端上。以独立的应用程序
运行,用户必须手动去下载并安装这些原生
App
。用户可以自由地选择是否更
新软件版本,所以会出现不同用户同时使用不同版本的情况。同时也会导致
维护成本比较高。使用旧版本的用户无法体验新版本的完整功能。
Web App
基于手机浏览器运行。
类似于电脑上的网页。
可以通过
HTML
、
CSS
或者
JavaScript
来进行
Web APP
的开发,是一种框架
型
APP
开发模式
(HTML5 APP
框架开发模式
)
,具有跨平台的优势,该模式通
常由“
HTML5
云网站
+APP
应用客户端”两部分构成,
APP
应用客户端只需
安装应用的框架部份,而应用的数据则是每次打开
APP
的时候,去云端取数
据呈现给手机用户。
Web APP
更多是更多用于页面展示,侧重于简单的交互,只能使用有限的移
动硬件设备功能。
Web App
通过移动设备上的浏览器访问,软件更新只需要更新服务器就够了,
用户层面不需要做任何操作。不需要安装客户端,可以节省手机终端的内存
空间。
Web App
的所有的用户都是用同样的版本,所有用户获得的功能都是相同的。
版本更新比较方便,直接在服务器侧更新数据即可。一个功能做好了就能上
线,一天更新几十次都毫无压力。如果客户端只是个浏览器,那一切都会变
得很简单。
Hybrid App
现在比较流行是将原生
App
和
Web App
进行融合。
应用大的框架是原生的,其他详细的内容就通过网页封装,这样做的好
处就是在方便更新的同时,也能保证核心功能的交互体验。
主要以
JS+Native
两者相互调用为主,从开发层面实现“一次开发,多处运行”
的机制,成为真正适合跨平台的开发。
目前已经有众多
Hybrid App
开发成功应用,比如百度、网易等知名移动应用,
都是采用
Hybrid App
开发模式。
2.4
测试
NativeApp
查看设备信息
查看设备名
adb devices
查看系统版本
adb shell getprop ro.build.version.release
查看
App
名称和
App
启动项名称
adb shell dumpsys window w | findstr \/ | findstr name=
使用
uiautomatorviewer
发现元素
\Android\sdk\tools\bin\uiautomatorviewer.bat
解决
adb
版本不一致问题
可以分别查看
platform-tools
中的
adb
版本和
nox\bin\adb
版本
不一致时,会导致模拟器不能正常运行或者
Appium
不能正常测试
拷贝
platform-tools
下的
adb.exe
、
AdbWinApi.dll
、
AdbWinUsbApi.dll
覆盖
nox\bin
的同名文件
重启模拟器
使用
appium
发现元素
打开
App
设置能力
{
"platformName": "Android",
"deviceName": "127.0.0.1:62001",
"platformVersion": "7.1.2",
"appPackage": "com.android.calculator2",
"appActivity": ".Calculator"
}
编写测试脚本
设置
DesiredCapabilities
的属性
DesiredCapabilities devices = new DesiredCapabilities();
devices.setCapability("platformName", "Android");
devices.setCapability("deviceName","
设备名
");
devices.setCapability("platformVersion", "
系统版本如
7.1.2");
devices.setCapability("appPackage","app
包名
");
devices.setCapability("appActivity","app
启动项名
");
2.5
测试
WebApp
需要确保
Appium
中的
ChromeDriver
与
WebView
即浏览器的版本兼容
通过
Appium
日志查看
ChromeDriver
版本和
WebView
版本,不兼容时会给
出版本要求的信息
Appium
的
ChromeDriver
版本与
Chrome
即
Webview
版本对应关系
https://github.com/appium/appium/blob/master/docs/en/writing-runnin
g-appium/web/chromedriver.md
chromedriver 版本
支持的 Chrome 版本
v2.4
v29-32
v2.5
v29-32
v2.6
v29-32
v2.7
v30-33
v2.8
v30-33
v2.9
v31-34
v2.10
v33-36
v2.11
v36-40
v2.12
v36-40
v2.13
v38-41
v2.14
v39-42
v2.15
v40-43
v2.17
v42-43
v2.13
v42-45
v2.18
v43-46
v2.19
v43-47
v2.20
v43-48
v2.21
v46-50
v2.22
v49-52
v2.23
v51-53
v2.24
v52-54
v2.25
v53-55
v2.26
v53-55
v2.27
v54-56
v2.28
v55-57
v2.29
v56-58
v2.30
v58-60
v2.31
v58-60
v2.32
v59-61
v2.33
v60-62
v2.34
v61-63
v2.35
v62-64
v2.36
v63-65
v2.37
v64-66
v2.38
v65-67
v2.39
v66-68
v2.40
v66-68
v2.41
v67-69
v2.42
v68-70
v2.43
v69-71
v2.44
v69-71
v2.45
v70-72
v2.46
v71-73
chromedriver
下载地址
http://chromedriver.storage.googleapis.com/index.html
http://npm.taobao.org/mirrors/chromedriver/
这里
Appium
改用
1.9.1
版本
ChromeDriver
的位置
C:\Users\
用户名
\AppData\Local\Programs\Appium\resources\app\node_m
odules\appium\node_modules\appium-chromedriver\chromedriver\win
适合
chrome
版本的
chromedriver
覆盖上述目录的同名文件
重启
Appium
设备基本信息
查看设备名
adb devices
查看系统版本
adb shell getprop ro.build.version.release
查看
App
名称和
App
启动项名称
adb shell dumpsys window w | findstr \/ | findstr name=
device.setCapability("deviceName", "127.0.0.1:62001");
device.setCapability("platformName", "Android");
device.setCapability("platformVersion", "7.1.2");
指定
WebApp
使用的浏览器
查看浏览器信息
adb shell dumpsys window w | findstr \/ | findstr name=
devices.setCapability("appPackage","com.android.browser");
devices.setCapability("appActivity","com.android.browser.BrowserActivity");
启动
App
driver=new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/
hub"), devices);
<WebElement>
可以省略
打开
url
driver.get("http://www.baidu.com");
使用
appium
发现
web
元素
使用
uiautomatorviewer
有时不好用
打开
App
设置能力
{
"platformName": "Android",
"deviceName": "127.0.0.1:62001",
"platformVersion": "7.1.2",
"appPackage":"com.android.browser",
"appActivity":"com.android.browser.BrowserActivity"
}
指定每次运行测试前不重新安装
App
devices.setCapability("noReset",true);
操作元素
driver.findElementById("index-kw").click();
获取
App
类型
driver.get("http://www.baidu.com");
打开网页
Set<String> context = driver.getContextHandles();
System.out.println(context);
查看获取到的
App
的
Web
代码
System.out.println(driver.getPageSource());
切换框架
driver.context("WEBVIEW_com.android.browser");
指定
App
中可以输入中文
device.setCapability("unicodeKeyboard", true);
device.setCapability("resetKeyboard", true);
driver.findElementById("index-kw").sendKeys("
手机测试
");
3 genymotion
模拟器
3.1
注册账号
个人账户免费使用。
http://www.genymotion.net
3.2
安装
需要安装
genymotion
和
virtualBox
。
3.3
下载操作系统镜像
Android9
3.4
导入导出操作系统镜像
Virtual Box
导出为
ova
文件
3.5
解决
adb
版本冲突问题
genymotion
默认使用的是自己自带的
adb.exe
,在使用的时候可能会出现
adb
冲
突
查看
genymotion
的
adb
版本
\Genymobile\Genymotion\tools
选择一致使用的
sdk
,也就是和
Android studio SDK
一致
settings→adb→use custom
3.6
测试
Native App
查看设备信息
查看设备名
adb devices
查看系统版本
adb shell getprop ro.build.version.release
查看
App
名称和
App
启动项名称
adb shell dumpsys window w | findstr \/ | findstr name=
使用
uiautomatorviewer
发现元素
使用
appium
发现元素
设置能力
{
"platformName": "Android",
"deviceName": "192.168.120.102:5555",
"platformVersion": "9",
"appPackage": "com.android.calculator2",
"appActivity": ".Calculator"
}
编写测试脚本
设置
DesiredCapabilities
的属性
DesiredCapabilities devices = new DesiredCapabilities();
devices.setCapability("platformName", "Android");
devices.setCapability("deviceName","192.168.120.102:5555");
devices.setCapability("platformVersion", "9");
devices.setCapability("appPackage","com.android.calculator2");
devices.setCapability("appActivity","com.android.calculator2.Calculator");
3.7
设置
genymotion
联网
3.8
测试
WebApp
需要确保
Appium
中的
ChromeDriver
与
WebView
即浏览器的版本兼容
这里
Appium
使用
1.9.1
版本
使用
appium
发现元素
设置能力
{
"deviceName":"192.168.120.102:5555",
"platformName":"Android",
"platformVersion":"9",
"appPackage":"com.android.quicksearchbox",
"appActivity":"com.android.quicksearchbox.SearchActivity",
"noReset":true
}
编写测试脚本
设置
DesiredCapabilities
的属性
DesiredCapabilities devices = new DesiredCapabilities();
devices.setCapability("platformName", "Android");
devices.setCapability("deviceName","192.168.194.101:5555");
devices.setCapability("platformVersion", "9");
device.setCapability("appPackage", "com.android.quicksearchbox");
device.setCapability("appActivity",
"com.android.quicksearchbox.SearchAc tivity");
device.setCapability("noReset", true);
device.setCapability("unicodeKeyboard", true);
device.setCapability("resetKeyboard", true);
driver=new
AndroidDriver(new
URL("http://localhost:4723/wd/hub
"),device);
进行测试
driver.findElementById("com.android.quicksearchbox:id/search_src_text").
sendKeys("www.baidu.com");
driver.pressKeyCode(66);
Thread.sleep(3000);
//driver.context("WEBVIEW_org.chromium.webview_shell");
上句不能加
Set<String> context = driver.getContextHandles();
System.out.println(context);
driver.findElementById("org.chromium.webview_shell:id/url_field").clear()
;
driver.findElementById("org.chromium.webview_shell:id/url_field").sendK
eys("www.baidu.com");
driver.pressKeyCode(66);
Thread.sleep(3000);
driver.findElementById("index-kw").clear();
driver.findElementById("index-kw").click();
driver.findElementById("index-kw").sendKeys("
手机测试
");
driver.pressKeyCode(66);
Thread.sleep(5000);