executeAsyncScript超时

时间:2016-12-20 08:16:10

标签: rest xmlhttprequest protractor

我正在尝试使用以下代码执行executeAsyncScript

function get(url) {
  var callback = function(args) {
    console.log(args);
  };

  var defer = protractor.promise.defer();
  browser.executeAsyncScript(function (url, callback) {
    console.log("url" + url);
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
      if (xhr.readyState == XMLHttpRequest.DONE) {
        console.log(xhr.responseText);
        callback(xhr.responseText);
        defer.fulfill(xhr);
      }
    }
    xhr.open('GET', url , true);
    xhr.send();
  }, url);

  return defer.promise;
};

function setupCommon() {
  return get('https://example.com/rest/api/getsomething');
}

var flow = protractor.promise.controlFlow();
flow.execute(setupCommon);

如果我直接在浏览器控制台中执行传递给executeAsyncScript的代码,那么它可以工作。我得到了预期的输出。

console.log("url" + url);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
  if (xhr.readyState == XMLHttpRequest.DONE) {
    console.log(xhr.responseText);
    callback(xhr.responseText);
    defer.fulfill(xhr);
  }
}
xhr.open('GET', 'https://example.com/rest/api/getsomething', true);
xhr.send();

但是当我使用executeAsyncScript执行它时,它超时说:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

restapi不应该花费太多时间。我是这一切的新手。我不确定我做错了什么。有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

Jasmine的默认超时为2000毫秒,在您的情况下看起来不合适,因为它看起来确实有很多步骤

检查配置文件引用doc here,了解protractor.conf.js

中的不同超时配置

您可以在配置级别增加超时,如下所示

defaultTimeoutInterval: 60000, allScriptsTimeout:90000

或仅为此测试案例增加

this.timeout(60000)

答案 1 :(得分:0)

要执行的脚本的默认超时为0毫秒。在大多数情况下,包括下面的示例,必须事先将脚本超时WebDriver.Timeouts.setScriptTimeout(long,java.util.concurrent.TimeUnit)设置为足够大的值。

以下是提供上述信息的Java API链接

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html#executeAsyncScript-java.lang.String-java.lang.Object...-