基于Java语言的Appium的使用讲义

第一章 基于 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);
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值