作者:黄书力

概述

前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法。

uiautomatorviewer是谷歌在Android4.1及之后的版本中发布的一个用来扫描和分析Android应用程序的UI组件的GUI工具。

使用uiautomatorviewer,可以查看应用的UI布局、组件以及相关的属性。

lazy-uiautomatorviewer**是在uiautomatorviewer的基础上进行二次开发,添加了以下新功能的安卓App页面元素抓取工具:

  1. xpath生成
  2. xpath控件搜索确认
  3. 页面xpath自动一键抓取导出(单个控件或批量)
  4. 选择性抓取导出并自动生成java代码

使用方法

下载和启动

1.下载并安装安卓环境

为了使用uiautomatorviewer,首先需要下载并安装安卓环境(4.1+的SDK),方法大家可以自行百度。

2.替换jar包

将lazy-uiautomatorviewer 源码编译生成的jar包uiautomatorviewer.jar拷贝到安卓安装目录下的

\android-sdk\tools\lib 文件夹中替换掉原来的uiautomatorviewer.jar包。

jar包下载地址:

http://download.csdn.net/detail/kaka1121/9685936

lazy-uiautomatorviewer源码下载地址:

https://github.com/lazytestteam/lazyuiautomatorviewer;

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)--元素自动抓取的更多相关文章

  1. APP自动化框架LazyAndroid使用手册(1)--框架简介

    作者:cryanimal  QQ:164166060 APP自动化简介 APP自动化,即通过自动化的方式,对APP施行一系列的仿按键输入.触摸屏输入.手势输入等操作,以达到对APP的功能进行自动化测试 ...

  2. APP自动化框架LazyAndroid使用手册(4)--测试模板工程详解

    概述 前面的3篇博文分别对lazyAndroid的框架简介.元素抓取和核心API进行了说明,本文将基于框架给出的测试模板工程,详细阐述下使用该框架进行安卓UI自动化测试的步骤. 模板工程 先来看一下模 ...

  3. APP自动化框架LazyAndroid使用手册(3)--核心API介绍

    作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...

  4. Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)

    概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...

  5. App 自动化框架设计思路

    最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...

  6. Web自动化框架LazyUI使用手册(2)--先跑起来再说(第一个测试用例-百度搜索)

    作者:cryanimal QQ:164166060 上篇文章中,简要介绍了LazyUI框架,本文便来演示,如何从无到有快速搭建基于lazyUI的工程,并成功运行第一个测试用例. 本文以百度搜索为例,选 ...

  7. Web自动化框架LazyUI使用手册(1)--框架简介

    作者:cryanimal QQ:164166060 web端自动化简介 web端自动化,即通过自动化的方式,对Web页面施行一系列的仿鼠标键盘操作,以达到对Web页面的功能进行自动化测试的目的. 其一 ...

  8. APP自动化框架-ATX原理解析及JAVA版客户端

    作为网易开源的ATX APP自动化测试框架,对比现有的macaca自动化框架/Appium自动化框架,最大的特别就是在于可远程进行自动化测试 先给大家看一张我自己梳理的框架架构图 框架巧妙点: 1. ...

  9. Web自动化框架LazyUI使用手册(4)--控件抓取工具Elements Extractor详解(批量抓取)

    概述 前面的一篇博文详细介绍了单个控件抓取的设计思路&逻辑以及使用方法,本文将详述批量控件抓取功能. 批量抓取:打开一个web页面,遍历页面上所有能被抓取的元素,获得每个元素的iframe.和 ...

随机推荐

  1. [论文阅读] Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks(MTCNN)

    相关论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 概论 用于人脸检测和对 ...

  2. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

  3. JavaScript 字典(Dictionary)

    TypeScript方式实现源码 //  set(key,value):向字典中添加新元素. //  remove(key):通过使用键值来从字典中移除键值对应的数据值. //  has(key ...

  4. [LeetCode] Map Sum Pairs 映射配对之和

    Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a pair ...

  5. jenkins构建个人github上的项目

    最近刚进一家新公司,公司采用的是自动化集成测试工具jenkins进行,构建,部署项目 因为以前,没接触过这类工具,所以打算在自己本机安装一个jenkins进行学习 具体安装步骤,很简单,不做讲解 1. ...

  6. 精力(power)

    [问题描述]假设你有一个属性叫”精力值”, 这个属性的上限为 E, 一开始你的精力值为 E.每天结束时, 该属性会回复 R,但回复后不会超过上限 E. 现在有 N 天时间给你去工作, 若第 i 天花费 ...

  7. 【BZOJ1016】【JSOI2008】最小生成树计数

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

  8. bzoj 2435: [Noi2011]道路修建

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...

  9. 【LSGDOJ 1351】关灯

    题目描述 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被设置在一条直路的同一侧. 多瑞卡每晚到早晨 5 点钟都在晚会上,然后他开始关灯.开始时,他站在某一盏路灯的 ...

  10. poj 3348 Cow 凸包面积

    Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8122   Accepted: 3674 Description ...