我正在尝试使用以下代码执行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不应该花费太多时间。我是这一切的新手。我不确定我做错了什么。有人可以帮我解决这个问题。
答案 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链接