自定义uiautomatorviewer-xpath功能

2017-01-01 18:47
  • 在使用自动化测试中需要定位元素.一般都是使用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";
        }
  • 看看实际效果

Paste_Image.png

  • 打包成jar文件

Export->Java->Runnable Jar File

Paste_Image.png

java -jar auto.jar 就可以运行刚刚打的jar 包

更多参考我的源码