使用appium(1.4.16)在android7.0真机上测试程序时报错command failed shell "ps 'uiautomator'"的解决方式

标题党有木有,我也想走走标题党的路线,多一些尝试,多一份期待。。。

这里写图片描述

主标题: 使用appium(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.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

问题解决。

敲黑板,划重点
原因:
adb.js 中 this.shell(“ps ‘” + name + “’”, function (err, stdout) {
对应执行的指令是ps ‘uiautomator’, Android7不支持这个指令格式,所以执行结果是bad pid ‘uiautomator’
目前Appium未对此进行处理,所以需要修改此指令的执行方式

这只是版本不兼容问题的解决方法之一,或许你用了该方法还不ok,还需要不断去探索~

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_15283475/article/details/80001157