量角器:失败:过时的元素引用:click()

时间:2019-03-04 18:34:24

标签: protractor each

当我尝试单击与给定文本匹配的下拉元素时,我遇到上述问题。下拉菜单的所有选项均与跨度包含文本的图像相同。 我尝试了此处链接中给出的操作,但没有成功。 Protractor: Failed: stale element reference: element is not attached to the page document。标签的参考如下图所示。 The tags used are <ul><li>.

我的代码看起来像这样

element.all(by.css('ul[class='ui-dropdown-items ui']>li')).each(function(element) {
  element.getText().then(function (text) {
     if (text.includes("Bag")){
       element.click();
     }
  });
});

尽管上述语句执行了点击操作,但仍会引发错误。 另外,当我尝试单击任何索引作为硬编码时,它也没有错误。 element.all()。get(4),其中4是元素的索引。 我的应用程序是在角度5中。 有人可以帮我这个忙!这阻止了我的项目。

1 个答案:

答案 0 :(得分:2)

element.all().each()在每个元素上执行迭代,即使您添加了if条件仅单击全部元素中的一个,但是每次迭代中的getText()仍将执行。

单击匹配的元素后,页面将重定向或刷新。然后在“新”页面上的下一个元素上调用getText(),这就是为什么报告stale reference exception

您需要过滤匹配的元素,然后单击它。

// approach 1
element
.all(by.css('ul[class='ui-dropdown-items ui']>li'))
.filter(function(ele) {
  return ele.getText().then(function (text) {
     return text.includes("Bag");
  });
})
.then(function(eles){
    if (eles && eles.length > 0) {
        eles[0].click()
    } 
})

// approach 2
let options = element.all(by.css('ul[class='ui-dropdown-items ui']>li'))

options.getText(function(txts) {
  return txts.findIndex(function(txt){
    return txt.includes('Bag');
  })
})
.then(function(index){
    return index !== -1 && options.get(index).click();
})