我整套环境是在 Appium 源码环境下进行。

autoLaunch 设置为 False 时,脚本无法做任何动作,看一下相关代码:

if (this.device.args.autoLaunch === false) {
    // if user has passed in desiredCaps.autoLaunch = false
    // meaning they will manage app install / launching
    if (typeof this.device.noLaunchSetup === "function") {
      this.device.noLaunchSetup(function (err) {
        if (err) return cb(err);
        cb(null, this.device);
      }.bind(this));
    } else {
      cb(null, this.device);
    }
  } else {
    // the normal case, where we launch the device for folks

    var onStart = function (err, sessionIdOverride) {
      if (sessionIdOverride) {
        this.sessionId = sessionIdOverride;
        logger.debug("Overriding session id with " +
                    JSON.stringify(sessionIdOverride));
      }
      if (err) return this.cleanupSession(err, cb);
      logger.debug("Device launched! Ready for commands");
      this.setCommandTimeout(this.desiredCapabilities.newCommandTimeout);
      cb(null, this.device);
    }.bind(this);

    this.device.start(onStart, _.once(this.cleanupSession.bind(this)));
  }

this.device.start(onStart, _.once(this.cleanupSession.bind(this)));
只有在 device.start 函数中才会才会实例化 Uiautomator 对象,然后建立与 Bootstrap 的 Socket 连接。
而这步骤只有在 autoLaunch 为 True 的情况才能执行。

看一下 noLaunchSetup 函数的具体内容:

Android.prototype.noLaunchSetup = function (cb) {
  logger.debug("Setting up Android for 'autoLaunch: false'");
  async.series([
    this.initJavaVersion.bind(this),
    this.initAdb.bind(this),
  ], function (err) { cb(err); });
};

只有 initJavaVersion 和 initAdb ,完全没有初始化 AppiumServer 对象下 Android 对象(也就是 device)的 Uiautomator 对象。
如果是这样,那 autoLaunch=False 的情况,脚本岂不是完全不能做动作?

将 noLaunchSetup 修改为:

Android.prototype.noLaunchSetup = function (cb) {
  logger.debug("Setting up Android for 'autoLaunch: false'");
  async.series([
    this.initJavaVersion.bind(this),
    this.initAdb.bind(this),
    this.initUiautomator.bind(this),
    function (cb) {this.uiautomator.start(cb);}.bind(this)
  ], function (err) { cb(err); });
};
``
就可以了

这是代码的Bug还是设置autoLaunch 为Flase后还要设置其他的参数才能在脚本中做动作

请大神解答一下


↙↙↙阅读原文可查看相关链接,并与作者交流