我有一个Protractor调用,它返回一个promise,而promise包含一个值。
var e = element.all(by.css("selector")).first();
e.getAttribute('id').then(function (text) {
console.log(text);
});
我想对getAttribute()
返回的承诺执行blocking wait并检索生成的文本。
这需要一个阻止功能;添加then
需要重写我们现有的许多测试。我怎么写这个?
修改
我要做的是从页面中检索一个值并使用它来构建一个元素选择器。所以:
element.all(by.css("...")).first().getAttribute('id')
var elementSelector = '#X' + elementOneID + '-Y';
element(by.css(elementSelector))...
我会接受任何允许我这样做的答案。
编辑2:
显然,如果没有回调,这是不可能的。我结束了revising my CSS selectors。
答案 0 :(得分:1)
你是说这个?
var e = element.all(by.css("selector")).first();
browser.wait(function() {
return e.getAttribute('id').then(function (id) {
if(id === 'oneIWant') {
return true;
} else {
return false;
}
});
},3000,'Waiting for the id value to be something awesome');
从WebDriverJS文档here您可以找到以下引用。因此,如果您有一系列selenium-webdriver命令,它们将被推送到promise Manager队列,它们将一个接一个地执行。当你说等待没有阻止下一个命令时,它肯定意味着你的等待条件不正确。
promise Manager维护一个计划任务队列,执行 每一个在队列中的一个完成之前。 WebDriver API位于promise Manager
之上
请检查量角器的预期条件here
var EC = protractor.ExpectedConditions;
var e = element.all(by.css("...")).first();
browser.wait(EC.presenceOf(e), 10000);
if(e.isPresent()) {
e.getAttribute('id').then(function(elementOneID) {
var elementSelector = '#X' + elementOneID + '-Y';
var el = element(by.css(elementSelector));
browser.wait(EC.presenceOf(el), 10000);
el.click(); //or do stuff
});
}
答案 1 :(得分:-1)
你实际上无法阻止。由于JavaScript是单线程的,因此等待时不会发生任何事情。如果你阻止,量角器永远不会解决这个承诺。 see this answer to a similar question
您可以使用es7's async await获得对承诺的阻止外观,但只有在使用像babel这样的转发器时才能使用该功能。
但是,我相信@nilesh的答案正是你要找的。 browser.wait
基本上会反复运行一个函数,直到它返回true
,或者它超时,但它不会阻塞该线程。