使用appium在android7.0真機上測試程式時報錯command failed shell "ps 'uiautomator'"的解決方式
阿新 • • 發佈:2019-02-12
使用appium在android7.0真機上測試程式時報錯command failed shell “ps ‘uiautomator’”的解決方式
appium目前最新的windows版本是1.4.16,在android7.0真機上測試程式時會報錯:command failed shell “ps ‘uiautomator’”。
網上大多數人的解決方法如下:
1、找到appium的安裝目錄下的adb.js檔案,目錄為:Appium\node_modules\appium\node_modules\appium-adb\lib
2、開啟adb.js,找到如下程式碼:
ADB.prototype.getPIDsByName = function (name, cb) { logger.debug("Getting all processes with '" + name + "'"); this.shell("ps '" + name + "'", function (err, stdout) { if (err) return cb(err); stdout = stdout.trim(); var procs = []; var outlines = stdout.split("\n");
在這段程式碼下面加入這行程式碼:
outlines.shift();
3、重啟appium
而我用這種方法並沒有解決問題,最後找到了下面這種方法,在這裡分享一下:
1、找到appium的安裝目錄下的adb.js檔案,目錄為:Appium\node_modules\appium\node_modules\appium-adb\lib
2、開啟adb.js,找到如下程式碼:
ADB.prototype.shell = function (cmd, cb) { if (cmd.indexOf('"') === -1) { cmd = '"' + cmd + '"'; } var execCmd = 'shell ' + cmd; this.exec(execCmd, cb); };
在這段程式碼下面加入這段程式碼:
ADB.prototype.shell_grep = function (cmd, grep, cb) {
if (cmd.indexOf('"') === -1) {
cmd = '"' + cmd + '"';
}
var execCmd = 'shell ' + cmd + '| grep ' + grep;
this.exec(execCmd, cb);
};
再找到如下程式碼:
ADB.prototype.getPIDsByName = function (name, cb) { logger.debug("Getting all processes with '" + name + "'"); this.shell("ps '" + name + "'", function (err, stdout) { if (err) return cb(err); stdout = stdout.trim(); var procs = []; var outlines = stdout.split("\n"); outlines.shift(); _.each(outlines, function (outline) { if (outline.indexOf(name) !== -1) { procs.push(outline); } }); if (procs.length < 1) { logger.debug("No matching processes found"); return cb(null, []); } var pids = []; _.each(procs, function (proc) { var match = /[^\t ]+[\t ]+([0-9]+)/.exec(proc); if (match) { pids.push(parseInt(match[1], 10)); } }); if (pids.length !== procs.length) { var msg = "Could not extract PIDs from ps output. PIDS: " + JSON.stringify(pids) + ", Procs: " + JSON.stringify(procs); return cb(new Error(msg)); } cb(null, pids); }); };
把這段程式碼註釋掉,用如下程式碼代替:
ADB.prototype.getPIDsByName = function (name, cb) {
logger.debug("Getting all processes with '" + name + "'");
this.shell_grep("ps", name, function (err, stdout) {
if (err) {
logger.debug("No matching processes found");
return cb(null, []);
}
var pids = [];
_.each(procs, function (proc) {
var match = /[^\t ]+[\t ]+([0-9]+)/.exec(proc);
if (match) {
pids.push(parseInt(match[1], 10));
}
});
if (pids.length !== procs.length) {
var msg = "Could not extract PIDs from ps output. PIDS: " +
JSON.stringify(pids) + ", Procs: " + JSON.stringify(procs);
return cb(new Error(msg));
}
cb(null, pids);
});
};
3、重啟appium
問題解決。