APP自动化框架LazyAndroid使用手册(2)--元素自动抓取
作者:黄书力
概述
前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法。
uiautomatorviewer是谷歌在Android4.1及之后的版本中发布的一个用来扫描和分析Android应用程序的UI组件的GUI工具。
使用uiautomatorviewer,可以查看应用的UI布局、组件以及相关的属性。
lazy-uiautomatorviewer**是在uiautomatorviewer的基础上进行二次开发,添加了以下新功能的安卓App页面元素抓取工具:
- xpath生成
- xpath控件搜索确认
- 页面xpath自动一键抓取导出(单个控件或批量)
- 选择性抓取导出并自动生成java代码
使用方法
下载和启动
1.下载并安装安卓环境
为了使用uiautomatorviewer,首先需要下载并安装安卓环境(4.1+的SDK),方法大家可以自行百度。
2.替换jar包
将lazy-uiautomatorviewer 源码编译生成的jar包uiautomatorviewer.jar拷贝到安卓安装目录下的
\android-sdk\tools\lib 文件夹中替换掉原来的uiautomatorviewer.jar包。
jar包下载地址:
lazy-uiautomatorviewer源码下载地址:
3.启动lazy-uiautomatorviewer
双击安卓安装目录下的 \android-sdk\tools\uiautomatorviewer.bat 文件,启动lazy-uiautomatorviewer。
演示
这里以京东钱包apk某个发行版为例进行演示。手机打开app,连上电脑后,通过uiautomatorviewer.bat启动抓取工具,单击如图所示的按钮1,进行截屏,即可看到下图。
图中的标记:
1是截屏,是uiautomaterviewer原生的功能,是所有后续功能的基础;
2是一键导出所有控件的xpth并生成java代码;
3是选择部分控件导出;
4是鼠标移动到控件上的示例;
5是控件xpath搜索,用于验证xpath能否唯一定位控件的;
6是鼠标悬停或单击控件后显示对应的xpath。
1.一键导出页面内所有控件xpath
单击上图所示的按钮2,会弹出文件保存的路径选择框。选择路径,输入文件名后,点击保存,会将当前页面的控件xpath及其变量定义全部导出到java文件中。
由于上图所示页面控件较多,导出的文件中变量较多,不便于展示代码。切换到京东钱包的登录页,一键导出的java文件是这样的:
package test.java.bean;
import lazy.android.annotations.*;
import lazy.android.bean.BaseBean;
import lazy.android.controls.*;
import io.appium.java_client.AppiumDriver;
/**
* Gennerated by lazyUiautomaterViewer.
*/
public class LoginBean extends BaseBean{
@Xpath(xpath={"//android.widget.TextView[@resource-id='com.wangyin.payment:id/txt_main_title']"})
@Description(description="登录")
public PlainText textView1;
@Xpath(xpath={"//android.view.View[@resource-id='com.wangyin.payment:id/view_divider_line']"})
@Description(description="")
public View view1;
@Xpath(xpath={"//android.widget.ScrollView[@resource-id='com.wangyin.payment:id/fragment_container']"})
@Description(description="")
public View scrollView2;
@Xpath(xpath={"//android.widget.RadioGroup[@resource-id='com.wangyin.payment:id/main_footbar_menu']"})
@Description(description="")
public View radioGroup3;
@Xpath(xpath={"//android.widget.RadioButton[@resource-id='com.wangyin.payment:id/login_tab_phone']"})
@Description(description="钱包账户")
public Click jdpayAccount;
@Xpath(xpath={"//android.widget.RadioButton[@resource-id='com.wangyin.payment:id/login_tab_jd']"})
@Description(description="京东账户")
public Click jdAccount;
@Xpath(xpath={"//android.widget.LinearLayout[@resource-id='com.wangyin.payment:id/layout_login_jd']/android.view.View[1]"})
@Description(description="")
public View view4;
@Xpath(xpath={"//android.widget.EditText[@resource-id='com.wangyin.payment:id/cp_input_combox_jd']"})
@Description(description="京东商城手机号/用户名/邮箱")
public Text editTextUserName;
@Xpath(xpath={"//android.widget.TextView[@text='账号']"})
@Description(description="账号")
public PlainText textView2;
@Xpath(xpath={"//android.widget.ImageView"})
@Description(description="")
public View imageView5;
@Xpath(xpath={"//android.widget.EditText[@resource-id='com.wangyin.payment:id/cp_input_pwd']"})
@Description(description="")
public Text editJDTextPwd;
@Xpath(xpath={"//android.widget.TextView[@text='密码']"})
@Description(description="密码")
public PlainText textView3;
@Xpath(xpath={"//android.widget.LinearLayout[@resource-id='com.wangyin.payment:id/layout_login_jd']/android.view.View[2]"})
@Description(description="")
public View view6;
@Xpath(xpath={"//android.widget.Button[@resource-id='com.wangyin.payment:id/btn_login_jd']"})
@Description(description="登 录")
public Click buttonLogin;
@Xpath(xpath={"//android.widget.TextView[@resource-id='com.wangyin.payment:id/txt_jd_register']"})
@Description(description="注册京东账户")
public PlainText textView4;
@Xpath(xpath={"//android.widget.TextView[@resource-id='com.wangyin.payment:id/txt_forget_pwd']"})
@Description(description="忘记密码?")
public PlainText textView5;
@Xpath(xpath={"//android.widget.EditText[@resource-id='com.wangyin.payment:id/cp_input_combox_wy']"})
@Description(description="请填写手机号")
public Text editTextPhone;
@Xpath(xpath={"//android.widget.TextView[@text='手机号']"})
@Description(description="手机号")
public PlainText textViewPhone;
@Xpath(xpath={"//android.widget.Button[@resource-id='com.wangyin.payment:id/btn_login']"})
@Description(description="下一步")
public Click nextStep;
@Xpath(xpath={"//android.widget.EditText[@resource-id='com.wangyin.payment:id/cp_input_pwd']"})
@Description(description="")
public Text editjdPayTextPwd;
@Xpath(xpath={"//android.widget.TextView[@text='密码']"})
@Description(description="密码")
public PlainText textViewPwd;
@Xpath(xpath={"//android.widget.Button[@resource-id='com.wangyin.payment:id/btn_login']"})
@Description(description="登 录")
public Click jdpayLogin;
public LoginBean(AppiumDriver aDriver){super(aDriver);}
}
package名大家使用的时候需要修改成自己的,
import的jar包前3个是lazyAndroid的(下载地址:https://github.com/lazytestteam/LazyAndroid),第4个是AppiumDriver的(可以自行百度下载)。
文件末尾的 public LoginBean(AppiumDriver aDriver){super(aDriver);} 是自动生成的类的构造函数,用于实例化AppiumDriver。
2.导出部分控件xpath
单击图一所示的按钮3,会弹出如下图所示的控件选择窗口(控件-变量定义窗口);
鼠标选停到左边截图中的某个控件上时,控件选择窗口中的xpath和Description(如果没有的话,就不会显示)会跟随变化;
输入ControlName(控件的变量名字)后,点击“添加控件”按钮,即可加入到右边的已选控件栏;
在已选控件栏,单击已选中的某个控件,可以重新修改或删除;
控件选择完成后,点击“导出到文件”即可导出本页面已选中的控件的代码(基于xpath定义的变量;
导出的java文件和一键导出的文件类似,只是控件的数量精简一点了;
3.xpath搜索
做自动化时时常会遇到xpath无法定位到元素或者无法唯一定位一个元素的情况。使用本工具,可以方便快捷地验证xpath是否能唯一定位目标控件。
使用方法:打开app目标页面,截图,在如下所示输入框中输入xpath后,点击搜索按钮,该xpath对应的目标页面就会用红色的框框标注起来了。如果匹配到多个控件,就会在左边的页面中看到多个红色框框了
总结
该工具能大大节省安卓UI自动化实施过程中需要针对每个控件需要单独抓取xpath的时间,使QA只需要专注于测试逻辑的设计,需要使用哪个页面元素和控件,只需要直接使用LazyUiAutomatorViewer自动生成的对应变量即可,真正地使用面向对象的思想进行测试编码,极大地提高了安卓UI自动化测试的编码效率。
导出的java文件可以直接导入到基于LazyAndroid的测试工程中进行使用,例子可参考文章《APP自动化框架LazyAndroid使用手册(4)–模板工程详解》(下载地址http://blog.csdn.net/kaka1121/article/details/53325265)和模板工程http://download.csdn.net/detail/kaka1121/9685943,也可以根据需要,仅选用其中的部分xpath使用。
APP自动化框架LazyAndroid使用手册(2)--元素自动抓取的更多相关文章
- APP自动化框架LazyAndroid使用手册(1)--框架简介
作者:cryanimal QQ:164166060 APP自动化简介 APP自动化,即通过自动化的方式,对APP施行一系列的仿按键输入.触摸屏输入.手势输入等操作,以达到对APP的功能进行自动化测试 ...
- APP自动化框架LazyAndroid使用手册(4)--测试模板工程详解
概述 前面的3篇博文分别对lazyAndroid的框架简介.元素抓取和核心API进行了说明,本文将基于框架给出的测试模板工程,详细阐述下使用该框架进行安卓UI自动化测试的步骤. 模板工程 先来看一下模 ...
- APP自动化框架LazyAndroid使用手册(3)--核心API介绍
作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...
- Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)
概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...
- App 自动化框架设计思路
最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...
- Web自动化框架LazyUI使用手册(2)--先跑起来再说(第一个测试用例-百度搜索)
作者:cryanimal QQ:164166060 上篇文章中,简要介绍了LazyUI框架,本文便来演示,如何从无到有快速搭建基于lazyUI的工程,并成功运行第一个测试用例. 本文以百度搜索为例,选 ...
- Web自动化框架LazyUI使用手册(1)--框架简介
作者:cryanimal QQ:164166060 web端自动化简介 web端自动化,即通过自动化的方式,对Web页面施行一系列的仿鼠标键盘操作,以达到对Web页面的功能进行自动化测试的目的. 其一 ...
- APP自动化框架-ATX原理解析及JAVA版客户端
作为网易开源的ATX APP自动化测试框架,对比现有的macaca自动化框架/Appium自动化框架,最大的特别就是在于可远程进行自动化测试 先给大家看一张我自己梳理的框架架构图 框架巧妙点: 1. ...
- Web自动化框架LazyUI使用手册(4)--控件抓取工具Elements Extractor详解(批量抓取)
概述 前面的一篇博文详细介绍了单个控件抓取的设计思路&逻辑以及使用方法,本文将详述批量控件抓取功能. 批量抓取:打开一个web页面,遍历页面上所有能被抓取的元素,获得每个元素的iframe.和 ...
随机推荐
- [论文阅读] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks(MTCNN)
相关论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 概论 用于人脸检测和对 ...
- java内部类、接口、集合框架、泛型、工具类、实现类
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...
- JavaScript 字典(Dictionary)
TypeScript方式实现源码 // set(key,value):向字典中添加新元素. // remove(key):通过使用键值来从字典中移除键值对应的数据值. // has(key ...
- [LeetCode] Map Sum Pairs 映射配对之和
Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a pair ...
- jenkins构建个人github上的项目
最近刚进一家新公司,公司采用的是自动化集成测试工具jenkins进行,构建,部署项目 因为以前,没接触过这类工具,所以打算在自己本机安装一个jenkins进行学习 具体安装步骤,很简单,不做讲解 1. ...
- 精力(power)
[问题描述]假设你有一个属性叫”精力值”, 这个属性的上限为 E, 一开始你的精力值为 E.每天结束时, 该属性会回复 R,但回复后不会超过上限 E. 现在有 N 天时间给你去工作, 若第 i 天花费 ...
- 【BZOJ1016】【JSOI2008】最小生成树计数
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- bzoj 2435: [Noi2011]道路修建
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...
- 【LSGDOJ 1351】关灯
题目描述 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被设置在一条直路的同一侧. 多瑞卡每晚到早晨 5 点钟都在晚会上,然后他开始关灯.开始时,他站在某一盏路灯的 ...
- poj 3348 Cow 凸包面积
Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8122 Accepted: 3674 Description ...