作者:黄书力
概述
前面的一篇博文简要介绍了安卓自动化测试框架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使用。