如果找不到元素,appium nodejs(wd)将挂起

时间:2017-05-04 08:36:52

标签: javascript android node.js mocha appium

我在使用appium + nodejs(wd)+ mocha时遇到了问题,因为我有一个加载视图(blackbox测试&我不是android app开发者),我想等待它的消失。所以我试过这样的事情:

wd.addPromiseChainMethod('waitForElementByIdDisappears', function (id, retries) {
    var self = this;
    return new Promise(function (resolve, reject) {
        (function waitForElementDisappears(retry, context){
            if(retry < 0) {
              return reject();
            }
            else {
              try {
                context.elementByIdIfExists(id, function(err, element) {
                  console.log('Element found: ' + element + ' retry: ' + retry);
                  if(typeof element === 'undefined') {
                    return resolve();
                  }
                  else {
                    setTimeout(() => waitForElementDisappears(retry-1, context), 1000);
                  }                  
                });
              }
              catch (error) {
                console.log(error);
                return reject();
              }
            }
        })(retries, self);
    });
});

一切正常,直到加载视图消失,因为nodejs开始挂起appium独立控制台输出:

  

info:[debug] [BOOTSTRAP] [debug]使用:UiSelector [RESOURCE_ID = de.myapp.foo:id / loadingView]   info:[debug] [BOOTSTRAP] [debug] getElements selector:UiSelector [RESOURCE_ID = de.myapp.foo:id / loadingView]   info:[debug] [BOOTSTRAP] [debug] Element []为null:(0)

一遍又一遍地重复,直到它在超时时间内运行。

我也尝试过:

hasElementById(value, cb) -> cb(err, boolean)

elementByIdOrNull(value, cb) -> cb(err, element)

elementsById(value, cb) -> cb(err, element)  (并检查元素列表是否为空)

和其他句法方式如:

context.elementByIdIfExists(id).then(element => { ... })

但每次我的输出都是这样的:

Element found: 15 retry: 30
Element found: 15 retry: 29
Element found: 15 retry: 28
Element found: 15 retry: 27

# hangs because the loading view was disappeared and appium standalone starts to repeat the [debug][info] section above ...

感谢阅读&amp;帮助!

1 个答案:

答案 0 :(得分:0)

我之前使用过appium独立版,现在更改为最新的npm appium版本1.6.x.But最后在我的方法之前设置.setImplicitWaitTimeout(250)并在该方法之后重置它为我做了诀窍。