APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

时间:2022-08-01 03:36:11

作者:黄书力

概述

前面的一篇博文简要介绍了安卓自动化测试框架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。

APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

演示

这里以京东钱包apk某个发行版为例进行演示。手机打开app,连上电脑后,通过uiautomatorviewer.bat启动抓取工具,单击如图所示的按钮1,进行截屏,即可看到下图。

APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

图中的标记:

1是截屏,是uiautomaterviewer原生的功能,是所有后续功能的基础;

2是一键导出所有控件的xpth并生成java代码;

3是选择部分控件导出;

4是鼠标移动到控件上的示例;

5是控件xpath搜索,用于验证xpath能否唯一定位控件的;

6是鼠标悬停或单击控件后显示对应的xpath。

1.一键导出页面内所有控件xpath

单击上图所示的按钮2,会弹出文件保存的路径选择框。选择路径,输入文件名后,点击保存,会将当前页面的控件xpath及其变量定义全部导出到java文件中。

APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

由于上图所示页面控件较多,导出的文件中变量较多,不便于展示代码。切换到京东钱包的登录页,一键导出的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

APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

单击图一所示的按钮3,会弹出如下图所示的控件选择窗口(控件-变量定义窗口);

鼠标选停到左边截图中的某个控件上时,控件选择窗口中的xpath和Description(如果没有的话,就不会显示)会跟随变化;

输入ControlName(控件的变量名字)后,点击“添加控件”按钮,即可加入到右边的已选控件栏;

在已选控件栏,单击已选中的某个控件,可以重新修改或删除;

控件选择完成后,点击“导出到文件”即可导出本页面已选中的控件的代码(基于xpath定义的变量;

导出的java文件和一键导出的文件类似,只是控件的数量精简一点了;

3.xpath搜索

做自动化时时常会遇到xpath无法定位到元素或者无法唯一定位一个元素的情况。使用本工具,可以方便快捷地验证xpath是否能唯一定位目标控件。

使用方法:打开app目标页面,截图,在如下所示输入框中输入xpath后,点击搜索按钮,该xpath对应的目标页面就会用红色的框框标注起来了。如果匹配到多个控件,就会在左边的页面中看到多个红色框框了

APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

总结

该工具能大大节省安卓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. AndroidSQLite多出一个(db.journal文件原因)

    今天在Android开发中中将sqlite的数据库创建之后,发现生成的.db文件的旁边 生成了一个大小为0的与数据库文件同名的.db-journal文件,不明白此文件的用途,于是 google了sql ...

  2. Hibernate中两种删除用户的方式

    第一种,是比较传统的,先根据主键列进行查询到用户,在进行删除用户 //删除数据 public void deleteStudent(String sno) { init() ; Student qu ...

  3. 在C代码中调用C++接口

    一 在C源文件中调用C++封装的接口 例如: 要想在A.c文件中,调用生命在B.h,实现在B.cpp中的接口bool getMAC(char *mac_addr); 其实现方法 B.cpp 如下: / ...

  4. (笔记)angular 包含关系的controller参数传递

  5. 关于promise

    后来发现promise是解决异步的一个链式调用的好的方法,避免了所谓的回调的*, 它有三个状态,未作为,已经完成和已经失败,起始是未作为,然后有了动作总会有个结果, 分成resolve,已经顺利ok ...

  6. Maven的常用命令

    转载:http://www.cnblogs.com/phoebus0501/archive/2011/05/10/2042511.html Maven库: http://repo2.maven.org ...

  7. VI文件编辑操作说明

    vi Hello.c (回车后就进入,按i或a键开始编辑.要退出按ESC,进入中间模式,按冒号 :后面跟命令):wq (保存并退出):q!(退出不保存)

  8. MySQL Replication Error 处理一例

    故障现象 MySQL slave status详情 mysql> show slave status\G *************************** 1. row ********* ...

  9. UVA 10622 - Perfect P-th Powers(数论)

    UVA 10622 - Perfect P-th Powers 题目链接 题意:求n转化为b^p最大的p值 思路:对n分解质因子,然后取全部质因子个数的gcd就是答案,可是这题有个坑啊.就是输入的能够 ...

  10. requireJS的初步掌握(二)

    前面我们讲述了requireJS的一些认知和优点,==>http://www.cnblogs.com/wymbk/p/6366113.html 这章我们主要描述的是requireJS的一些常用的 ...