【问题标题】:Protracter filter called many times量角器过滤器多次调用
【发布时间】:2020-08-26 17:12:51
【问题描述】:

我有一个包含一些行的航班信息网格,其中包含航班号等属性。现在,我想根据目标航班号flightno 过滤该行。这里flightno的值为15984234,代码如下

let trTarget = element.all(by.css('[kendogridlogicalrow]')).filter(tr => {
  return tr.all(by.css("[data-kendo-grid-column-index='1']")).getText().then(cellstxt => {
    console.log(cellstxt + '++++')
    console.log('1')
    if (cellstxt.includes(FlightNo)) {
      console.log(cellstxt + '----')
      console.log('2')
      return true;
    } else {
      return false;
    }
  });
}).first()

trTarget.getText().then(cellstxt => {
  console.log(cellstxt + '&&&&')
  console.log('3')
})

这些代码被包装成一个函数locateTrWithId,它返回trTarget。

在调用函数的地方,代码如下所示

let trTarget = this.locateTrWithId(flightno);
var ele = trTarget.all(by.tagName('a')).first()
browser.wait(EC.elementToBeClickable(ele), 10000)
ele.getText().then(txt => {
  console.log(txt + '*****')
  console.log('4')
})
ele.close()

函数locateTrWithId正常工作,但是当我尝试打印一些细节时,我发现了一些有趣的东西,查看console.log结果

15983767++++
1
15984065++++
1
15984234++++
1
15984234----
2
p&&&&
3
15983767++++
1
15984065++++
1
15984234++++
1
15984234----
2
15983767++++
1
15984065++++
1
15984234++++
1
15984234----
2
15983767++++
1
15984065++++
1
15984234++++
1
15984234----
2
15983767++++
1
15984065++++
1
15984234++++
1
15984234----
2
15984234*****
4
15983767++++
1
15984065++++
1
15984234++++
1
15984234----
2

如截图所示,filter部分被调用了5次,其中1次与从过滤后的trTarget(print 3)中get text部分一起执行,其他部分独立执行

另外一件事是调用并执行函数locateTrWithId后,得到返回trTarget的文本(打印4),过滤器再次执行!

以下是部分相应的 HTML 代码

<tr kendogridlogicalrow="" data-kendo-grid-item-index="0" role="row" class="ng-star-inserted">...</tr>
<tr kendogridlogicalrow="" data-kendo-grid-item-index="1" role="row" class="ng-star-inserted">...</tr>
<tr kendogridlogicalrow="" data-kendo-grid-item-index="2" role="row" class="ng-star-inserted">
  <td kendogridcell="" kendogridlogicalcell="" role="gridcell" aria-selected="false" data-kendo-grid-column-index="0" colspan="1" aria-colindex="1" class="ng-star-inserted">...</td>
  <td kendogridcell="" kendogridlogicalcell="" role="gridcell" aria-selected="false" data-kendo-grid-column-index="1" colspan="1" aria-colindex="2" class="ng-star-inserted"><a href="#/admin/manifest-detail/30707" class="ng-star-inserted"> 15984234</a>
  </td>

</tr>

请解释一下。非常感谢!

【问题讨论】:

  • 我实际上已经问过一个非常相似的问题here,但从未真正得到回答。我想知道为什么它也会多次遍历每个元素。我怀疑我们永远不会确定,除非我们自己深入研究代码并弄清楚。

标签: typescript filter protractor autotest


【解决方案1】:

我有一个解决方案可以避免多次调用过滤器

private locateTrWithId(GridIndex: number, FlightNo: string) {
  let tbTarget = this.opr.locateTb(GridIndex);

  var tdswithhyperlink = tbTarget.all(by.tagName('a'))
  tdswithhyperlink.each(td => {
    browser.wait(EC.elementToBeClickable(td), 10000)
  })
  return tbTarget.all(by.css('[kendogridlogicalrow]')).filter(tr => {
    tr.element(by.css("[data-kendo-grid-column-index='1']")).getText().then(txt => {
      console.log(txt + '++++')
      console.log('1')
    })
    return tr.all(by.css("[data-kendo-grid-column-index='1']")).getText().then(cellstxt => {
      if (cellstxt.includes(FlightNo)) {
        console.log(cellstxt + '++++')
        console.log('2')
        return true;
      } else {
        return false;
      }
    });
  }).first().element(by.tagName('a')).click()
}

在这里,我将点击操作集成到过滤操作(因此我删除了返回/过滤的 trTarget 的获取文本的部分)。执行结果是

15983767++++
1
15984065++++
1
15984234++++
1
15984234++++
2

但我无法解释原因....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2015-10-01
    • 2015-05-30
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多