[uiautomator篇][11]下载dump,解析xml的方法

  • 1 project/pad(你的项目)/build-gradle
添加:红色部分

dependencies {
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
    testCompile ‘junit:junit:4.12‘
    androidTestCompile ‘com.android.support:support-annotations:24.0.0‘
    androidTestCompile ‘com.android.support.test:runner:0.4.1‘
    androidTestCompile ‘com.android.support.test:rules:0.4.1‘
    compile ‘com.android.support:appcompat-v7:24.0.0‘
    androidTestCompile ‘com.android.support.test.uiautomator:uiautomator-v18:2.1.1‘
    compile ‘dom4j:dom4j:20040902.021138‘
}
  • 2 sync project with Gradle Files (在工具栏倒数第四个,像眼睛和wifi)

同样是为了解决有些时候采用uiautomater不能点击某个控件的问题,新增布局文件解析接口。

主要作用:代码中无法查找到控件时,我们使用dump布局文件,此段代码主要解析dump文件,可根据任意UiObeject的任意属性,获取它其余的属性

例如布局文件下有text为Play music的控件,想获取其位置,具体效果如下:

import org.dom4j.Element;

/**
 * 数据实体类
 *
 * @author ***
 */
public class XMLBean {

public final Element element;
public final int index;
public final String text;
public final String resourceId;
public final String classText;
public final String packageText;
public final String contentDesc;
public final boolean checkable;
public final boolean checked;
public final boolean clickable;
public final boolean enable;
public final boolean focusable;
public final boolean focused;
public final boolean scrollable;
public final boolean long_clickable;
public final boolean password;
public final boolean selected;
public final String bounds;

public XMLBean(Element element) {
this.element = element;

index = Integer.parseInt(element.attributeValue("index"));
text = element.attributeValue("text");
resourceId = element.attributeValue("resource-id");
classText = element.attributeValue("class");
packageText = element.attributeValue("package");
contentDesc = element.attributeValue("content-desc");
checkable = Boolean.parseBoolean(element.attributeValue("checkable"));
checked = Boolean.parseBoolean(element.attributeValue("checked"));
clickable = Boolean.parseBoolean(element.attributeValue("clickable"));
enable = Boolean.parseBoolean(element.attributeValue("enabled"));
focusable = Boolean.parseBoolean(element.attributeValue("focusable"));
focused = Boolean.parseBoolean(element.attributeValue("focused"));
scrollable = Boolean.parseBoolean(element.attributeValue("scrollable"));
long_clickable = Boolean.parseBoolean(element.attributeValue("long-clickable"));
password = Boolean.parseBoolean(element.attributeValue("password"));
selected = Boolean.parseBoolean(element.attributeValue("selected"));
bounds = element.attributeValue("bounds");

}

@Override
public String toString() {
return "XMLBean [index=" + index + ", text=" + text + ", resourceId=" + resourceId + ", classText="
+ classText + ", packageText=" + packageText + ", contentDesc=" + contentDesc
+ ", checkable=" + checkable + ", checked=" + checked + ", clickable=" + clickable
+ ", enable=" + enable + ", focusable=" + focusable + ", focused=" + focused
+ ", scrollable=" + scrollable + ", long_clickable=" + long_clickable + ", password="
+ password + ", selected=" + selected + ", bounds=" + bounds + "]";
}

}

package com.softwinner.app;

import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObjectNotFoundException;
import android.support.test.uiautomator.Until;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;

/**
 * Created by *** on 2017/7/21.
 */

public class TestAA {

    private static List<XMLBean> list;
    private static final String PATH = "/sdcard/window_dump.xml";
    private final static int LAUNCH_TIMEOUT = 5000;
    UiDevice device;

    @Before
    public void setup(){
        device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
    }

    @Test
    public void testAA() throws UiObjectNotFoundException, IOException, InterruptedException {

        File file = new File(PATH);
        device.dumpWindowHierarchy(file);
        if (!file.exists()) {
            print("No File");
            return;
        }
        try {
            list = new LinkedList<XMLBean>();
            // 1、读取xml文件
            SAXReader reader = new SAXReader();
            Document document = reader.read(file);
            // 2、获取根节点
            Element rootNode = document.getRootElement();
            treeWalk(rootNode);
            print("list::" + list.toString());
            print("list.size::" + list.size());
            if (list != null)
                list.clear();
            list = null;
            print("End");
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void print(Object obj) {
        System.out.println(obj);
    }

    private void treeWalk(Element element) throws UiObjectNotFoundException {
        String text;
        for (Iterator i = element.elementIterator(); i.hasNext(); ) {
            Element elementNode = (Element) i.next();
            if (elementNode.elements().size() > 0) {
                treeWalk(elementNode);
            }
            print(elementNode.toString());
            XMLBean bean = new XMLBean(elementNode);
            print("-------------------------------------------");
            if(bean.text.equals("Play Music")){
                print(bean.bounds);
            }
            print("-------------------------------------------");
            list.add(bean);
        }
    }
 
时间: 2024-10-29 11:54:04

[uiautomator篇][11]下载dump,解析xml的方法的相关文章

SimpleXML php 解析xml 的方法

SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据.不过它不适用于包含namespace的xml,而且要保证xml格式完整(well-formed).它提供了三个方法:simplexml_import_dom.simplexml_load_file.simplexml_load_string,函数名很直观地说明了函数的作用.三个函数都返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElem

解析XML的方法

解析XML的方法 1.DOM生成和解析XML 2.SAX生成和解析XML 3.DOM4J生成和解析XML 4.JDOM生成和解析XML

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都

[uiautomator篇][11]wifi

package com.softwinner.network.wifi; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.

Android中解析XML的方法

假设我要解析如下的XML文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <books> 3 <book price="99.0" 出版日期="2008年">疯狂java讲义</book> 4 <book price="199.0" 出版日期="2009年">疯狂android讲义&l

android 中解析XML的方法(转)

在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的.本文中将使用XmlPullParser来解析,分别解析不同复杂度的test1.xml.test2.xml.test3.xml.代码如下: MainActivity: package com.home.xmlparsetest; import java.io.IOException; import java.io.InputStream; import java.ut

xml简介和dom4j解析xml重要方法

1.xml(可扩展标记语言)的概述 与html的区别: xml: 描述数据,用于存储和传输数据.标签都是自定义的 html:显示数据,标签都是预定义的 注意事项: 文档声明必须在第一行 只有一个根标签 元素只能包裹嵌套,不能交叉嵌套 注释不能嵌套 标签命名规则:字母.数字.下划线.减号.英文句点组成,严格区分大小写 属性值要用单引号或双引号 2.约束文档 1.DTD(Document tyte definition)--->约束xml的书写规范 a DTD文件的书写 <?xml version

最简单的JAVA解析XML字符串方法

引入 dom4j 包<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version></dependency> 比如阿里云视频转码服务的回调通知解析,代码如下: import org.dom4j.Document; import org.dom4j.DocumentException; im

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.