我整套环境是在 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后还要设置其他的参数才能在脚本中做动作?
请大神解答一下。