导图社区 Appium
Appium是一个开源的,适用于原生或混合移动应用( hybrid mobile apps )的自动化测试工具,Appium应用WebDriver: JSON wire protocol驱动安卓和iOS移动应用。
编辑于2021-06-01 17:59:40性能知识架构包含业务及架构知识、工具知识、系统知识、编程知识。具体内容包括性能测试类型,工具等、实战siege性能测试、HTTP协议、测试教程网的介绍、HTTP消息、cookie特性2、jemter录制回放、jemter插件机函数介绍等。
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
Python高级应用技巧。Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
社区模板帮助中心,点此进入>>
性能知识架构包含业务及架构知识、工具知识、系统知识、编程知识。具体内容包括性能测试类型,工具等、实战siege性能测试、HTTP协议、测试教程网的介绍、HTTP消息、cookie特性2、jemter录制回放、jemter插件机函数介绍等。
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
Python高级应用技巧。Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
Appium知识点
Appium介绍
1. Appium 是一个自动化测试开源工具
2. 支持 iOS 平台和 Android 平台
原生应用
用 iOS 或者 Android SDK 写的应用(Application 简称 app)
web 应用
使用移动浏览器访问的应用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)
混合应用
原生代码封装网页视图——原生代码和 web 内容交互
3. Appium 是一个跨平台的工具
它允许测试人员在不同的平台(iOS,Android)使用同一套 API 来写自动化测试脚本, 这样大大增加了 iOS 和 Android 测试套件间代码的复用性
4. 支持多平台、多语言
appium 是跨平台的,可以用在 OSX,Windows 以及 Linux 桌面系统上运行
5. Appium 与 Selenium 关联性
Appium 类库封装了标准 Selenium 客户端类库
Appium 客户端类库实现了 Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和 W3C Webdriver spec(一个传输不可预知的自动化协议,该协议定义了 MultiAction 接口)的元素
Appium 服务端定义了官方协议的扩展,为 Appium 用户提供了方便的接口来执行各种设备动作。例如在测试过程中安装/卸载 app
6. appium-Server 由 appium-Desktop 替代
7. 需要的准备工作
编程语言( Python 或 java)
appium client
appium Server
测试运行环境(安卓模拟器 或 真实手机)
环境搭建
安装 Java JDK
Java 官方网站:http://www.java.com/zh_CN/
Java 环境分 JDK 和 JRE
JDK 就是 Java Development Kit。简单的说 JDK 是面向开发人员使用的SDK,它提供了 Java 的开发环境和运行环境。
JRE 是 Java Runtime Enviroment 是指 Java 的运行环境,是面向 Java 程序的使用者
JDK 下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html
设置环境变量
JAVA_HOME环境变量
变量名:JAVA_HOME
变量值:D:\Java\jdk1.8.0_144
变量名:CALSS_PATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
PATH环境变量
变量名:PATH
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
验证 Java 是否成功( 打开Windows 命令)
“java -version”命令查看当前 Java 版本信息。
“javac”命令可以将 Java 源文件编译为 class 字节码文件。
“java”命令可以运行 class 文件字节码。
安装 Android SDK
Android SDK(Software Development Kit),软件开发工具包
官方推荐下载包含 Android SDK 的 Android Studio
下载地址:https://developer.android.com/studio/index.html?hl=zh-cn
其它 Android SDK 下载地址:http://tools.android-studio.org/index.php/sdk
设置 Android 环境变量
变量名:ANDROID_HOME
变量值:D:\android\Android\sdk
变量名:PATH
变量值:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
安装 Android 版本(镜像文件)
双击 SDK Manage.exe 启动 SDK 管理器
查找到国内的 Android 镜像,安装一个版本的 Android 虚拟机
这里推荐一个网站:http://www.androiddevtools.cn/
启动 Android 模拟器
点击“Create...”按钮,创建 Android 虚拟机,点击启动进行启动虚拟机
安装 Appium-Desktop
什么是 Appium-desktop?
appium 移动测试中有个很重新的组件 appium-Server,它主要用来监听我们的移动设备(真机或模拟器),然将不同编程语言编写的 appium 测试脚本进行解析,然后,驱动移动设备来运行测试
下载地址:https://github.com/appium/appium-desktop/releases
项目地址:https://github.com/appium/appium-desktop
说明:现在Appium-Desktop 即将替代 appium-Server组件
启动:双击快捷桌面进行启动,进入后默认host和端口号,点击确定启动即可
安装 Appium Client
Appium Client 是对 webdriver 原生 API 的一些扩展和封装。它可以帮助我们更容易的写出用例,写出更好懂的用例
支持多种编程语言编写自动化测试脚本(Python,java, php......)
推荐通过 pip 进行安装“Appium-Python-Client”。安装方法: pip install Appium-Python-Client
Appium运行验证步骤
1. 启动安卓模拟器
2. 启动 Appium-desktop
3. 通过 Python 编写 Appium 自动化测试脚本。
Appium基础
Desired Capabilities
Desired Capabilities 在启动 session 的时候是必须提供的,本质上是以 key value 字典的方式存放,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。
Desired Capabilities参数说明
deviceName:启动哪种设备,是真机还是模拟器?iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4...
automationName:使用哪种自动化引擎。appium(默认)还是 Selendroid。
platformName:使用哪种移动平台。iOS, Android, orFirefoxOS。
platformVersion:指定平台的系统版本。例如指的 Android 平台,版本为 5.1。
appActivity:待测试的 app 的 Activity 名字。比如 MainActivity、.Settings。注意,原生 app 的话要在activity 前加个"."。
appPackage:待测试的 app 的 Java package。比如 com.example.android.myApp, com.android.setting
appActivity & appPackage 获取方式
1. 直接问开发提供
2. 解压测试的安装包,找到AndroidManifest.xml文件:通过notepad++ 打开AndroidManifest.xml 文件,在里面搜索:manifest对应的就是appPackage。
3. 通过日志查找:打开APP,执行> adb logcat>D:/log.txt;胡乱的对APP做一些操作;Ctrl+c 结束adb命令;打开log.txt文件,搜索:Displayed
控件定位
Android 元素定位必不可少的工具是 uiautomatorviewer。
定位方法
Id定位:
resource-id 就是我们理解的 id 属性了。
使用方法:driver.find_element_by_id("com.android.calculator2:id/formula")
Name 定位
新版 appium-Desktop 不再支持
老版本方法:driver.find_element_by_name('9')
新版本方法:driver.find_element_by_android_uiautomator('text("9")')
Calass Name定位
使用此方法会获得一组数据,通过遍历打印出对应的值
XPath定位
Accessibility ID定位
对应的元素名称为:content-desc
使用方法:driver.find_element_by_accessibility_id("plus")
android uiautomator
使用说明:获取content-desc里面的值
使用方法:driver.find_element_by_android_uiautomator('new UiSelector().description("plus")')
其它定位(这些是针对 WebView 容器下面的控件定位的,因为现在针对的是 Native App 暂时还没有用到)
driver.find_element_by_tag_name(name)
driver.find_element_by_link_text(link_text)
driver.find_element_by_partial_link_text(link_text)
driver.find_element_by_css_selector(css_selector)
appium Desktop两大亮点
提供手机元素定位
1.启动appium Desktop
2. 右上角有一个 放大镜的按钮点击打开
3. 把手机对应的配置参数添加到表格中
例如: desired_caps['deviceName'] = 'Android Emulator' desired_caps['automationName'] = 'Appium' desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '6.0' desired_caps['appPackage'] = 'com.android.calculator2' desired_caps['appActivity'] = '.Calculator'
4. 点击右下角“Start Session”按钮,等待... 模拟器自动启动
5. 移动鼠标到想要定位的元素,查看右侧对应的列表(所有对应的元素属性将会展示)
脚本录制
1、点击“top by coordinates”按钮, 这是一种通过坐标定位元素的方式。
2、点击“Start Recording”按钮,选中表示处理录制状态。
3、这个时候就可以在左则的 App 界面上点点点了。脚本会随着我们的点击生成。
4. 选择不同的脚本语言进行导出,运行验证
备注说明:此方法导出脚本全部为“坐标”方法,因每个手机尺寸与规格不同,不推荐使用,
Appium API
应用操作
安装应用
方法:install_app()
例如:driver.install_app('path/to/my.apk') driver.install_app("D:\\android\\apk\\ContactManager.apk")
卸载应用
方法:remove_app()
driver.remove_app('com.example.android.apis')
关闭应用
方法:close_app()
driver.close_app() :不需要入参
检查应用是否安装
方法:is_app_installed()
driver.is_app_installed()
返回结果Ture 或 False
启动应用
方法:launch_app()
例:driver.launch_app()
将应用置于后台
方法:background_app()
driver.background_app(10) # 将应用置于后台 10 秒
应用重置
方法:reset()
driver.reset() :重置应用。类似于清除应用缓存。这个方法不需要入参。
上下文操作
可用上下文
方法:contexts
driver.contexts :获取当前所有的可用的上下文。注意这是一个语句,所以不需要括号“()”
当前上下文
方法:current_context
driver.current_context:获取当前的可用的上下文。注意这是一个语句不需要括号“()”
切换上下文
switch_to.context() 切换到指定的上下文中。
例如:driver.switch_to.context('NATIVE_APP') driver.switch_to.context('WEBVIEW_1')
键盘操作
send_keys() 方法
例如:names[1].send_keys("jack")
keyevent() 方法 (Android only)
方法:keyevent();发送一个键码的操作。需要一个入参。
电话键
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
基本
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
TouchAction 操作
按压控件
方法:press()
press(self, el=None, x=None, y=None) 此方法默认需要三个参数,点击的元素,触摸屏的 x 坐标与 y 作标。三个参数都非必传。
长按控件
方法:long_press()
开始按压一个元素或坐标点(x,y)。 long_press(self, el=None, x=None, y=None, duration=1000) 相比 press()方法,long_press()多了一个入参,即长按的时间。duration 以毫秒为单位。其用法与 press()方法相同。
点击控件
方法:tap()
对一个元素或控件执行点击操作。 tap(self, element=None, x=None, y=None, count=1) 相比 press()方法多了 count 的入参。个人猜测是点击的控件的次数,默认为 1 次。用法参考 press()。
移动
方法:move_to()
将指针(光标)移动到新的元素或坐标上。 move_to(self, el=None, x=None, y=None)其用法参考 press()方法。
暂停
方法:wait()
暂停脚本的执行,单位为毫秒。 wait(self, ms=0) 其用法参考 press()的用法。
其它操作
锁定(iOS only)
方法:lock()
driver.lock(5) #锁定屏幕 5 秒种
当前package (Android only)
方法:current_package 获取当前包名(package)。仅支持 Android
driver.current_package #获取当前应用的包名
当前Activity(Android only)
方法:current_activity 得到当前应用的 activity。只适用于 android。此方法不需要括号“()”或入参。
driver. driver.current_activity #获取当前应用的 activity
滑动
方法:driver.swipe(75, 500, 75, 0, 0.8) 模拟用户滑动。将控件或元素从一个位置(x,y)拖动到另一个位置(x,y)。 swipe(self, start_x, start_y, end_x, end_y, duration=None)
start_x:开始滑动的 x 坐标。 start_y:开始滑动的 y 坐标。 end_x:结束滑动的 x 坐标。 end_y:结束滑动的 y 坐标。 duration:持续时间
driver.swipe(75, 500, 75, 0, 0.8) #获取当前应用的 activity
Pinch(缩放)
方法:pinch() 在屏幕上使用捏(Pinch)手势(双指缩放屏幕)。pinch(self, element=None, percent=200, steps=50)
element:缩放的元素 percent:(可选) 缩放比例,默认是 200% steps:(可选) 缩放动作的步骤
el = driver.find_element_by_android_uiautomator('text("Img")') driver.pinch(element=el)
Zoom(放大)
方法:driver.zoom() 在屏幕上使用放大手势。zoom(self, element=None, percent=200, steps=50)
el = driver.find_element_by_android_uiautomator('text("Img")') driver.zoom(element=el)
拉出文件
方法:driver.pull_file() 从设备中拉出文件。pull_file(self, path)
例如:driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
推送文件
方法:driver.push_file() 推送文件到设备中去 push_file(self, path, base64data)
path: 设备上的路径 base64data:数据,编码为 base64,要写入文件。
data = "some data for the file" path = "/data/local/tmp/file.txt" driver.push_file(path, data.encode('base64'))
appium测试实例
1. 准备工作
1. 安装 Android app
2. 链接 Android 真机(adb验证,开启开发模式)
3. 获取 appPackage 和 appActivity
2. 编写自动化测试脚本
1. 使用 desktop 查找元素,uiautomatorviewer 工具的使用
2. 编写脚本
3. 执行自动化脚本验证