zoukankan      html  css  js  c++  java
  • bootstrap之DumpWindowHierarchy

    DumpWindowHierarchy


    package io.appium.android.bootstrap.handler;
    
    import android.os.Environment;
    import com.android.uiautomator.core.UiDevice;
    import io.appium.android.bootstrap.AndroidCommand;
    import io.appium.android.bootstrap.AndroidCommandResult;
    import io.appium.android.bootstrap.CommandHandler;
    import io.appium.android.bootstrap.utils.NotImportantViews;
    
    import java.io.File;
    
    /**
     * This handler is used to dumpWindowHierarchy.
     * https://android.googlesource.com/
     * platform/frameworks/testing/+/master/uiautomator
     * /library/core-src/com/android/uiautomator/core/UiDevice.java
     */
    @SuppressWarnings("ResultOfMethodCallIgnored")
    public class DumpWindowHierarchy extends CommandHandler {
      // Note that
      // "new File(new File(Environment.getDataDirectory(), "local/tmp"), fileName)"
      // is directly from the UiDevice.java source code.
      private static final File dumpFolder = new File(Environment.getDataDirectory(), "local/tmp");
      private static final String dumpFileName = "dump.xml";
      private static final File dumpFile = new File(dumpFolder, dumpFileName);
    
      private static void deleteDumpFile() {
        if (dumpFile.exists()) {
          dumpFile.delete();
        }
      }
    
      public static boolean dump() {
        dumpFolder.mkdirs();
    
        deleteDumpFile();
    
        try {
          // dumpWindowHierarchy often has a NullPointerException
          UiDevice.getInstance().dumpWindowHierarchy(dumpFileName);
        } catch (Exception e) {
          e.printStackTrace();
          // If there's an error then the dumpfile may exist and be empty.
          deleteDumpFile();
        }
    
        return dumpFile.exists();
      }
    
      /*
       * @param command The {@link AndroidCommand} used for this handler.
       *
       * @return {@link AndroidCommandResult}
       *
       * @throws JSONException
       *
       * @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.
       * bootstrap.AndroidCommand)
       */
      @Override
      public AndroidCommandResult execute(final AndroidCommand command) {
        NotImportantViews.discard(true);
        return getSuccessResult(dump());
      }
    }

    这种方法可能在某些机器上运行到不成功而让非常多人对这种方法不甚了解,而我做了非常长事件的功能遍历工具的开发,专门研究过这种方法,看看我之前写的文章就理解它是做什么的啦:


    dumpWindowHierarchy


    它是获取当前手机界面全部控件信息,然后把树形结构保存在/data/local/tmp的文件夹下的dump.xml文件里。所以我们看见上面类的定义有非常多关于路径、文件的字符串。就是这个原因。appium的这个DumpWindowHierarchy首先依据api的不同设置是否禁止布局压缩。假设api为18以上的。那么就启动布局压缩。这对我们获取实用的控件信息是非常有作用的。然后运行dump()方法,dump方法会先创建文件夹,当然该文件夹一般都会存在,无需创建。然后删除dump.xml文件,由于要创建新的,必须删除旧的。以免获取不到控件信息的时候,dump.xml里仍然有就信息返回。然后调用


    UiDevice.getInstance().dumpWindowHierarchy(dumpFileName);

    将控件树信息保存在里文件里。


    (android最终,在官方网站上!)

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    樊登读书 认知天性
    【笔记】Tapable源码解析图以及webpack怎样实现一个插件plugin
    web前端使用mcg-helper代码生成工具学习笔记
    博客记录
    15ISK 驱动 BIOS等
    蒙特卡洛方法和蒙特卡洛树搜索
    求最大k个数
    求阶乘的位数和后缀0个数
    五分钟看懂一致性哈希算法
    Windows下查看GPU(NVIDIA)使用情况
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4907141.html
Copyright © 2011-2022 走看看