gpt4 book ai didi

javascript - Angular Protractor : driver. 等待然后用 allScriptsTimeout 时间返回

转载 作者:行者123 更新时间:2023-11-29 19:33:40 25 4
gpt4 key购买 nike

我正在尝试测试一个 xmpp 聊天应用程序,但在测试异步操作的结果时遇到了一些困难。测试试图从您的名册(联系人列表)中删除联系人,并且 driver.wait 似乎没有在履行 promise 时解决。测试通过,但它在完成等待之前等待 11 秒(protractor.conf 中的 allScriptsTimeout),然后在浏览器窗口关闭之前评估 expect 语句后在 .then 中再花费 11 秒。这是代码,问题从 driver.wait() block 开始:

describe("When adding a contact to the roster", function() {
var jid = "testyeti@yeti.dslab.ad.adp.com";
var searchString = "yeti";
var editBtnId = jid + "_cog";
var plusBtnId = jid + "_add";
var searchId = "yeti-searchInput";
beforeEach(function() {
browser.get('/');
});
var addOrRemove = function(callbackWhenDone) {
expect(element(by.css('.yeti-contactList')).isPresent()).toBe(true);
var driver = browser.driver;
driver.manage().timeouts().implicitlyWait(10000).then(function() {
//wait for the roster to load async
expect(element(by.css('.yeti-rosterRight')).isPresent()).toBeTruthy();
});
var cog = element(by.id(editBtnId));
cog.isPresent()
.then(function(itIsThere) {
if (itIsThere) {
//remove this person from the roster if they are there
console.log(jid + " was in roster. Removing...");
//click the button to edit contact properites
cog.click();
//click to remove from roster
element(by.id('RemoveExisting')).click();
//click to confirm remove
element(by.id('SureRemove')).click();
//here's where things get interesting...
var deferred = protractor.promise.defer();
driver.wait(function() {
var poll = function() {
//check if the element is present until it gets removed
element(by.id(editBtnId)).isPresent().then(function(isPresent) {
console.log("(in promise.then) element isPresent? " + isPresent);
// isPresent is true if the server hasn't yet returned with a
// response to remove contact
// we need isPresent to be false before eval of expect statement below
if (!isPresent) {
deferred.fulfill(true);
return deferred.promise;
} else {
//check again
poll();
}
});
return deferred.promise;
};
poll();
return deferred.promise;
//tried the return statement below without the poll() wrapper, but
// isPresent().then() returned true (server hasn't responded yet)
//and it never entered if statement to resolve the promise that
// driver is waiting on
//return deferred.promise;
}, 5000, "\nTimed out waiting for element to not be present\n")
.then(function() {
//they were successfully removed from the roster and the view was updated
expect(element(by.id(editBtnId)).isPresent()).toBeFalsy();
});
} else {
//add this person to the roster if they are not there
...more unrelated code...
}
});
};

it('Successfully adds or removes a known user', function() {
addOrRemove.call(this);
});
});

控制台输出:

testyeti@yeti.dslab.ad.adp.com was in roster. Removing...
(in promise.then) element isPresent? true
(in promise.then) element isPresent? true
(in promise.then) element isPresent? true
(in promise.then) element isPresent? false <-(this takes 11 secs to show up)
Eval expect <- (this also takes 11 secs to show up)
. <- (green dot, test passed)

这是我的第二次尝试。简单多了,但测试没有通过(最终期望失败):

driver.wait(function() {
var condition = false;
element(by.id(editBtnId)).isPresent().then(function(isPresent) {
condition = isPresent;
});
console.log("returning " + (!condition));
return !condition;
}, 10000, "timed out").then(function() {
//they were successfully removed from the roster and the view was updated
expect(element(by.id(editBtnId)).isPresent()).toBeFalsy();
});

知道这里发生了什么吗?任何帮助将不胜感激,我已经坚持了很长一段时间......

最佳答案

原因

(in promise.then) element isPresent? false <-(this takes 11 secs to show up)

是因为你设置了一个非常高的隐式等待:

driver.manage().timeouts().implicitlyWait(10000)

作为detailed here它的优点是等待到那个时间才能找到一个元素,但缺点一直在等待负面测试,例如

expect(element(by.id(editBtnId)).isPresent()).toBeFalsy();

您可能正在使用隐式等待,因为您的测试有时会在未正确等待元素时失败?我在测试非 Angular 页面时遇到这个问题,因为 Protractor 不知道如何等待页面完全加载,因此您可以使用 custom function waitReady() browser.wait 元素准备就绪:

expect(element(by.css('.yeti-rosterRight')).waitReady()).toBeTruthy();

首先将此代码段集成到您的代码中:https://gist.github.com/elgalu/2939aad2b2e31418c1bb

关于javascript - Angular Protractor : driver. 等待然后用 allScriptsTimeout 时间返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com