等待承诺和检索结果的功能

时间:2015-08-06 22:26:24

标签: javascript promise protractor

我有一个Protractor调用,它返回一个promise,而promise包含一个值。

var e = element.all(by.css("selector")).first();

e.getAttribute('id').then(function (text) {
  console.log(text); 
});

我想对getAttribute()返回的承诺执行blocking wait并检索生成的文本。

这需要一个阻止功能;添加then需要重写我们现有的许多测试。我怎么写这个?

修改

我要做的是从页面中检索一个值并使用它来构建一个元素选择器。所以:

  1. 找到元素一的动态ID:element.all(by.css("...")).first().getAttribute('id')
  2. 根据该值构建选择器:var elementSelector = '#X' + elementOneID + '-Y';
  3. 使用元素二查找并执行某些操作:element(by.css(elementSelector))...
  4. 我会接受任何允许我这样做的答案。

    编辑2:

    显然,如果没有回调,这是不可能的。我结束了revising my CSS selectors

2 个答案:

答案 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');

EDIT1

从WebDriverJS文档here您可以找到以下引用。因此,如果您有一系列selenium-webdriver命令,它们将被推送到promise Manager队列,它们将一个接一个地执行。当你说等待没有阻止下一个命令时,它肯定意味着你的等待条件不正确。

  

promise Manager维护一个计划任务队列,执行   每一个在队列中的一个完成之前。 WebDriver   API位于promise Manager

之上

EDIT2

请检查量角器的预期条件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,或者它超时,但它不会阻塞该线程。