- 在使用自动化测试中需要定位元素.一般都是使用sdk下面的uiautomatorviewer,而此工具只能定位id,class,name等,但是没有xpath,
如何自动显示xpath路径?
准备工作
- 源码下载uiautomatorviewer
- 需要依赖的文件
- 对应的android.jar
- com.google.guava_XXX.jar
- common.jar
- ddmlib.jar
- org.eclipse.core.commands_XXX.jar
- org.eclipse.equinox.common_XXX.jar
- org.eclipse.jface_XXX.jar
- org.eclipse.swt.XXX.jar
- org.eclipse.jdt.core.prefs 这里的设置文件要注意下,有时候会报错java的编译版本错误,此坑坑得我太深
架构分析
- com.android.uiautomator:存放uiautomatorviewer工具的GUI界面代码,其中主入口UiAutomatorViewer.java文件里面有main函数入口,工具的窗口就在此创建。
- com.android.uiautomator.actions:存放所有anction操作,如:Device screenshot 、open等。
- com.android.uiautomator.tree:存放tree封装,dump出来的xml解析成一棵完整的tree,这个包是核心包。
代码修改部分
- com.android.uiautomator.tree 下的UiNode.class
// 我的新增
private String getNodeClassAttribute() {
return this.mAttributes.get("class");
}
//我的新增
public String getXpath()
{
String className=getNodeClassAttribute();
String xpath="//"+className;
String text = getAttribute("text");
if(text !=null&& !text.equals(""))
{
xpath += "[@text='"+text+"']";
return xpath;
}else
{
return getAttribute("content-desc") !=""?
xpath+"[@content-desc='"+getAttribute("content-desc")+"']"
:xpath+"[@index='"+getAttribute("index")+"']";
}
}
- com.android.uiautomator.tree 下的UiHierarchyXmlLoader.calss
private UiNode mTmpNode ;
public BasicTreeNode parseXml(String xmlPath) {
//我的修改
if (mParentNode != null) {
mParentNode.addChild(mWorkingNode);
//System.out.println(mNodeList.size());
if(mWorkingNode.getParent()!=null){
String xpath = ((UiNode)mWorkingNode).getXpath();
((UiNode)mWorkingNode).addAtrribute("xpath",xpath);
}
mNodeList.add(mWorkingNode);
//System.out.println(mNodeList.size());
}
- 注意com.android.uiautomator下面的DebugBridge类下的toolsDir路径,指定adb路径,这里要指定正确
private static String getAdbLocation() {
String toolsDir = System.getProperty("com.android.uiautomator.bindir"); //$NON-NLS-1$
if (toolsDir == null) {
// return null;
toolsDir ="D:\\app\\adt-bundle-windows-x86_64-20140702\\sdk\\tools";
}
- 看看实际效果
- 打包成jar文件
Export->Java->Runnable Jar File
java -jar auto.jar 就可以运行刚刚打的jar 包