Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 运行量角器/webdriver不知道的异步回调/承诺_Javascript_Selenium_Jenkins_Selenium Webdriver_Protractor - Fatal编程技术网

Javascript 运行量角器/webdriver不知道的异步回调/承诺

Javascript 运行量角器/webdriver不知道的异步回调/承诺,javascript,selenium,jenkins,selenium-webdriver,protractor,Javascript,Selenium,Jenkins,Selenium Webdriver,Protractor,有可能是这样的日志吗 07-<...>.js ... Stacktrace: [31m[31mError: Failed expectation[31m [31m at [object Object].<anonymous> (...06-....js)[31m[31m[22m[39m 我还有一个例子,在测试、断言和失败行之后,我有一个错误堆栈跟踪。Ej: 032 - "alert.msg" equals text: "invalid login"[32

有可能是这样的日志吗

07-<...>.js
...
Stacktrace: [31m[31mError: Failed expectation[31m
[31m    at [object Object].<anonymous> (...06-....js)[31m[31m[22m[39m
我还有一个例子,在测试、断言和失败行之后,我有一个错误堆栈跟踪。Ej:

     032 - "alert.msg" equals text: "invalid login"[32m✔[39m 033 - set detailTestLevel: 1
Finished in 3 seconds. Speed: 12.89 tests per second
Last Test Id: (ch_loginvalid_enUS_122_01)
[32m33 tests, 0 assertions, 0 failures
[39m
sh: 1: beep: not found

/home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1654
      var result = fn();
                   ^
Error: Index out of bound. Trying to access element at index:0, but there are only 0 elements
    at /home/*******/common/ext/ElementFinder.js:618:15
    at /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/base.js:1582:15
    at [object Object].webdriver.promise.ControlFlow.runInNewFrame_     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1654:20)
    at notify     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:465:12)
    at notifyAll     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:442:7)
    at resolve     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:420:7)
    at fulfill     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:535:5)
    at /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/base.js:1582:15
    at [object Object].webdriver.promise.ControlFlow.runInNewFrame_     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1654:20)
    at notify     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:465:12)
    at [object Object].then     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:522:7)
    at Object.webdriver.promise.asap     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:767:11)
    at newFrame.onComplete     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1670:25)
    at [object Object].webdriver.promise.Frame_.notify_     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1914:5)
    at [object Object]._onTimeout     /home/*******/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1901:11)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Error
    at [object Object].ElementArrayFinder.applyAction_ (/home/*******/node_modules/protractor/lib/element.js:390:21)
    at [object Object].self.(anonymous function) [as getText]     /home/*******/node_modules/protractor/lib/element.js:77:19)
    at [object Object].self.(anonymous function) [as getText]     /home/*******/node_modules/protractor/lib/element.js:698:11)
    at [object Object].<anonymous> (/home/*******/common/ext/ElementFinder.js:512:16)
    at flow.execute.then.webdriverFailure (/home/*******/node_modules/jasminewd-retry/index.js:146:18)
    at [object Object].promise.ControlFlow.runInFrame_     /home/*******/node_modules/selenium-webdriver/lib/webdriver/promise.js:1877:20)
    at [object Object].promise.ControlFlow.runEventLoop_     /home/*******/node_modules/selenium-webdriver/lib/webdriver/promise.js:1755:8)
    at [object Object].<anonymous> (/home/*******/node_modules/selenium-webdriver/lib/webdriver/promise.js:2056:12)
    at [object Object].goog.async.run.processWorkQueue [as _onTimeout]     /home/*******/node_modules/selenium-webdriver/lib/goog/async/run.js:125:21)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
[launcher] Process exited with error code 1
这是ElementFinder:618:

// Fix current Protractor implementation so it keeps a reference to the
// original index as it was on previous Protractor versions: i.e. <= 1.2.0
ElementArrayFinder.prototype.get = function(index) {
  var self = this;
  var getWebElements = function() {
    return self.getWebElements().then(function(parentWebElements) {
      var i = index;
      if (i < 0) {
        // wrap negative indices
        i = parentWebElements.length + i;
      }
      if (i < 0 || i >= parentWebElements.length) {
        throw new Error('Index out of bound. Trying to access element at ' +  // line 618
            'index:' + index + ', but there are only ' +
            parentWebElements.length + ' elements');
      }
      return [parentWebElements[i]];
    });
  };
  getWebElements.with_index_ = index; // added
  return new ElementArrayFinder(this.ptor_, getWebElements, this.locator_).
      toElementFinder_();
};
//修复当前量角器实现,使其保留对
//与以前的量角器版本一样的原始索引:即=parentWebElements.length){
抛出新错误('索引超出范围。正在尝试访问'+//行618'处的元素
'索引:'+index+',但只有'+
parentWebElements.length+“elements”);
}
返回[parentWebElements[i]];
});
};
getWebElements.with_index=index;//补充
返回新的ElementArrayFinder(this.ptor_、getWebElements、this.locator_)。
toElementFinder_uz();
};

我写了这段代码,所以我不是100%了解它的功能。我认为它从element.all(“…”).get(x)中获取数组索引。

最后,我找到了解决方案

量角器1.7附带selenium webdriver作为依赖项


因此,如果您使用selenium webdriver作为依赖项,并且由于X原因无法避免,请确保package.json中的selenium webdriver版本与量角器的package.json(在本例中为2.44.0)中的版本相同。

您能在“06”中显示测试用例中的一些代码吗?从回溯来看,这似乎是罪魁祸首:
at[object]。(/home/*********/common/ext/ElementFinder.js:512:16)
。您有一些webdriver不知道的异步代码或承诺。修复方法是告诉webdriver有关promise/async代码的信息。但是如果没有一些测试代码本身,很难知道到底出了什么问题。很难说,但我怀疑
rit
可能会在重试过程中产生悬而未决的承诺?
rit
来自某个外部包?您可以尝试使用
rit
创建一个小测试用例,然后重试,看看它是否在封闭的
it
之后继续运行。我认为您是对的,问题与僵尸承诺有关。rit()在这里定义:项目使用该fork作为依赖项。我试图在本地重现这个问题,不幸的是,它似乎只发生在詹金斯。真想不到!我认为第208行(“promise.all”)创造了一个量角器不知道的承诺。捕获其结果并将其传递给
量角器.promise.controlFlow().await()
。基本上,一个简单的承诺对于量角器控制流是不会自动可见的,所以你需要将它们排队,或者确保排队的东西在等待它们。是的,这是我的假设。如果这不起作用,只需添加
console.log
行,直到您找出问题所在。:)
ElementFinder.prototype.itEqualsText = function(name, text) {
  if (_.isNully(text)) { text = name; name = this.originalName; };
  var elm = this; name = name || this.originalName;
  if (_.isNully(name)) throw new Error('needs name');
  if (_.isNully(text)) throw new Error('needs text');

  // This helps with stack traces after rit (retry it) timeouts.
  // If you attempt to build the trace within an it() block you
  // lose the whole trace because of the way Jasmine build the tests.

  rit('"' + name + '" equals text: "' + text + '"', function() {
    expect(elm.waitReady()).toBeTruthy();
    expect(elm.getText()).toEqual(text);  // line 512
  });
};
// Fix current Protractor implementation so it keeps a reference to the
// original index as it was on previous Protractor versions: i.e. <= 1.2.0
ElementArrayFinder.prototype.get = function(index) {
  var self = this;
  var getWebElements = function() {
    return self.getWebElements().then(function(parentWebElements) {
      var i = index;
      if (i < 0) {
        // wrap negative indices
        i = parentWebElements.length + i;
      }
      if (i < 0 || i >= parentWebElements.length) {
        throw new Error('Index out of bound. Trying to access element at ' +  // line 618
            'index:' + index + ', but there are only ' +
            parentWebElements.length + ' elements');
      }
      return [parentWebElements[i]];
    });
  };
  getWebElements.with_index_ = index; // added
  return new ElementArrayFinder(this.ptor_, getWebElements, this.locator_).
      toElementFinder_();
};