第一章 基于 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);

基于Java语言的Appium的使用讲义相关推荐

  1. Leetcode刷题第1题:两数之和(基于Java语言)

    ** Leetcode刷题第1题:两数之和(基于Java语言) ** 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 ...

  2. Leetcode刷题 463题:岛屿的周长(基于Java语言)

    ** Leetcode刷题 463题:岛屿的周长(基于Java语言) ** 一. 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相 ...

  3. 基于Java语言构建区块链(一)—— 基本原型

    最终内容请以原文为准:https://wangwei.one/posts/df1... 引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产 ...

  4. java 计算移动平均线_基于Java语言开发的个性化股票分析技术:移动平均线(MA)...

    基于Java语言开发的个性化股票分析技术:移动平均线(MA) 基于 Java 语言开发的个性化股票分析技术:移动平均线(MA)移动平均线(MA)是以道·琼斯的"平均成本概念"为理论 ...

  5. 基于Java语言构建区块链(四)—— 交易(UTXO)

    基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...

  6. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  7. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  8. 基于java语言轻量级实时风控引擎

    介绍: radar是一款基于java语言,使用Springboot + Mongodb + Groovy + Es等框架搭建的轻量级实时风控引擎,适用于反欺诈应用场景,极简的配置,真正做到了开箱即用. ...

  9. java 解析数据包_一种基于Java语言的网络通讯数据包解析方法与流程

    本发明涉及网络通讯领域,特别涉及一种基于Java语言的网络通讯数据包解析方法. 背景技术: 计算机系统和网络的大量普及使用使全球跨入了信息化时代.但是,正由于现代社会中几乎一切都在"计算机化 ...

最新文章

  1. 【linux】kill命令模板
  2. oracle主键id自动自增_Oracle主键ID设置自动增长(序列+触发器)
  3. 【clickhouse】mac 10.15.7使用docker安装clickhouse
  4. 动荡的 Java 今年将有哪些新变化?
  5. Unity3D实践3:BOSS血条
  6. 区块链应用大数据的优势有哪些
  7. [暴力]JZOJ 100036 随机
  8. 信息系统软件配置、过程管理、开发工具(详细介绍)
  9. Ubuntu虚拟机实现与主机之间复制粘贴
  10. mysql创建视图步骤_MySQL创建视图的详细步骤
  11. 淘宝宝贝商家编码 管理好你的宝贝
  12. redis安装教程和redis集群搭建--主从复制(读写分离)、中间人模式(主仆兼具、去中心化)、反客为主、哨兵模式,从实战出发的保姆级别教程
  13. IDEA生成springboot项目的两种方式
  14. 2016猴年春联集锦
  15. tensorboard命令报错:tensorboard.util has no attribute Retriev
  16. 关于“专家门”事件的回复
  17. seo搜索引擎最佳化,10大网站排名关键因素
  18. Android10定制Google开机向导
  19. Error: Cannot find module ‘@/views/xxx‘ at webpackEmptyContext
  20. R语言初级教程(04): 算术运算

热门文章

  1. 一种常规的四芯或多芯排线的线序检测电路
  2. DM backup database 报错[-7169](bakres与dmap消息通信失败)
  3. 使用 Eslint + husky + lint-staged + Prettier 提高前端项目质量、统一项目代码风格
  4. Python写节日贺卡
  5. 【Bug】HTC Vive Pro定位发生偏移或倾斜解决办法
  6. Esp32Cam WebServer 网页源代码查看与编辑
  7. java 运动的大球吃小球_JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型...
  8. python:大球吃小球
  9. 利用树莓派制作人体感应监控器
  10. Linux下C语言实现TCP文件传输