首页 > 解决方案 > Protractor 中的 Promise 是如何解决的?

问题描述

我有个疑问,上面写着:查找web元素是异步的,不管是单个元素还是集合,所以结果是一个promise。所以如果是这种情况,下面的代码片段是如何工作的:

describe('the contact list', () => {
 it('with filter: should find existing ' +
 'contact "Craig Service"', () => {
   let tbody = element(by.tagName('tbody'));
   let trs = tbody.all(by.tagName('tr'));
   let craigService = trs.filter(elem => {
   return elem.all(by.tagName('td')).get(1).getText()
     .then(text => {
       return text === 'Craig Service';
     });
   });

是不是 trs 需要使用 then().. 来解决,在我们移动到下一行使用过滤器函数 (craigService) 之前?如果这是由 Protractor promise -manager 处理的,我们是否可以使用相同的策略来使用 gettext().. 获取元素的文本..然后在不使用 then().. 的情况下使用它?

标签: javascriptjasmineprotractor

解决方案


如果这是由 Protractor promise -manager 处理的

量角器承诺管理器(AKA SELENIUM_PROMISE_MANAGER)从量角器 6 开始被删除。所以忘了它

查找 Web 元素是异步的

用我自己的话来说,以操作为目的查找 Web 元素(click()getText())是异步的,因此会返回一个需要解决的 Promise。但是你在这条线上有什么

let trs = tbody.all(by.tagName('tr'));

只是一个 elementArrayFinder 声明。它不返回承诺,因此它具有同步性质。所以你可以在你打开浏览器很久之前声明这个元素

如果您打算经常使用量角器,请将此量角器 API页面添加为书签。在此页面上,他们说明了每个命令返回的内容。如果没有promise.Promise或类似的东西,它不需要解决(例外是browser.get我碰巧知道也是一个承诺,但他们没有提到)

回答你的问题

是不是trs需要解决

根据量角器页面element()不返回 Promise,以及element.all()NO,它们不需要解决

现在,当您知道如何确定是否使用 Promise 时,让我们谈谈如何解决 Promises

  1. 好的旧.then()语法(不是很好,但确实很旧)
element(by.css('.class')).getText().then(function(text){
  console.log(text)
})

现在当你知道这个方法时,把它从你的记忆中抹去。这是额外的信息,会使您的代码不可读并且极难调试。看看这个Promise Hell你就会明白我在说什么

  1. async/await 这与在您的计算机上复制/粘贴一样好。上帝保佑两者的创造者,我无法想象没有他们的生活。所以 #1 中的相同代码现在看起来像这样
let text = await element(by.css('.class')).getText();
console.log(text)

当您查看代码段时,它不是更有意义吗?另一个例子见这个线程。基本上await对javascript说'停止,解决承诺,返回它的价值'

总而言之,如果你解决你的代码片段的承诺,async/await你会得到

describe('the contact list', () => {
  it('with filter: should find existing contact "Craig Service"', async () => { // pay attention to this async
    let tbody = element(by.tagName('tbody'));
    let trs = tbody.all(by.tagName('tr'));
    let craigService = await trs.filter(async elem => { // async again
      let text = await elem.all(by.tagName('td')).get(1).getText()
      return text === 'Craig Service'
    });

推荐阅读