• bootstrap之UpdateStrings


    UpdateStrings


    package io.appium.android.bootstrap.handler;
    
    import io.appium.android.bootstrap.AndroidCommand;
    import io.appium.android.bootstrap.AndroidCommandResult;
    import io.appium.android.bootstrap.CommandHandler;
    import io.appium.android.bootstrap.Logger;
    
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    
    import org.json.JSONObject;
    
    /**
     * This handler is used to update the apk strings.
     * 
     */
    public class UpdateStrings extends CommandHandler {
    
      /**
       * strings.json文件保存的是apk的strings.xml里的内容,在Bootstrap启动前由appium服务器解析并push到设备端的
       * 
       * @return
       */
      public static boolean loadStringsJson() {
        Logger.debug("Loading json...");
        try {
          final String filePath = "/data/local/tmp/strings.json";
          final File jsonFile = new File(filePath);
          // json will not exist for apks that are only on device
          // 你的case必须写明apk的路径,假设启动设备上已有的应用而case中没有app路径,此时json文件是不存在的
          // because the node server can't extract the json from the apk.
          if (!jsonFile.exists()) {
            return false;
          }
          final DataInputStream dataInput = new DataInputStream(
              new FileInputStream(jsonFile));
          final byte[] jsonBytes = new byte[(int) jsonFile.length()];
          dataInput.readFully(jsonBytes);
          // this closes FileInputStream
          dataInput.close();
          final String jsonString = new String(jsonBytes, "UTF-8");
          // 将读取出来的信息赋给Find类中的属性,以做后用
          Find.apkStrings = new JSONObject(jsonString);
          Logger.debug("json loading complete.");
        } catch (final Exception e) {
          Logger.error("Error loading json: " + e.getMessage());
          return false;
        }
        return true;
      }
    
      /*
       * @param command The {@link AndroidCommand} used for this handler.
       * 
       * @return {@link AndroidCommandResult}
       * 
       * @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.
       * bootstrap.AndroidCommand)
       */
      @Override
      public AndroidCommandResult execute(final AndroidCommand command) {
        if (!loadStringsJson()) {
          return getErrorResult("Unable to load json file and update strings.");
        }
        return getSuccessResult(true);
      }
    }

    在appium初始化的时候,假设你代码中加入了app应用,而不是启动手机设备中已经有的应用。这时候appium会将该app解析。并提取出设备当前语言环境的strings.xml文件中的信息保存在strings.json里,并将其push到手机的/data/local/tmp文件夹下,当你想要获取应用中用到的字符串时,手机会去该文件夹下读取strings.json文件并返回给client。

    所以上面的代码也就是我上面说的过程。





  • 相关阅读:
    前后端分离实践 — 如何解决跨域问题
    bower 和 npm 的区别详细介绍
    yeoman-bower-grunt之间的关系
    软件开发环境-开发环境、测试环境、生产环境的区别
    Tomcat下配置JNDI的三种方式
    SSE
    Java动态代理
    Css之Relative
    多线程之——死锁
    JVM
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5351851.html
Copyright © 2020-2023  润新知