Javascript 重定向到另一页后循环中的过时元素引用

Javascript 重定向到另一页后循环中的过时元素引用,javascript,asynchronous,promise,protractor,e2e-testing,Javascript,Asynchronous,Promise,Protractor,E2e Testing,在我的e2e测试中,我试图选择网站上类似对象的某个元素,然后单击它以更改到与该元素相关的另一个网站。问题是页面更改后循环仍在继续,因为承诺解决了异步问题(我对所有这些东西都不熟悉) 代码如下: goToCartridge(name){ let done = false; element(by.id('dashboard')).all(by.className('card z-depth-1')).then( elems => { for(let i =

在我的e2e测试中,我试图选择网站上类似对象的某个元素,然后单击它以更改到与该元素相关的另一个网站。问题是页面更改后循环仍在继续,因为承诺解决了异步问题(我对所有这些东西都不熟悉)

代码如下:

    goToCartridge(name){
    let done = false;
    element(by.id('dashboard')).all(by.className('card z-depth-1')).then( elems => {
      for(let i = 0; i < elems.length ; i++ ){
        if(done) break;
          elems[i].element(by.tagName('h2')).getText().then( text => {
            if(name === text) {
              element(by.id('cartridge-' + i)).click();
              done = true;
            }
          return;
        });
      }
    });
  }
goToCartridge(名称){
完成=错误;
元素(by.id('dashboard')).all(by.className('card z-depth-1'))。然后(elems=>{
for(设i=0;i{
如果(名称===文本){
元素(按.id('cartridge-'+i))。单击();
完成=正确;
}
返回;
});
}
});
}

在下一次迭代开始之前,如何在循环中等待异步部分?我搜索了很多解决方案,但还没有找到。

也许这样行得通,我将for循环改为array.map和filter。不确定Array.from是否适用于elms:

goToCartridge(name){
  element(by.id('dashboard')).all(by.className('card z-depth-1'))
  .then( 
    elems => {
      Promise.all(
        Array.from(elems).map(
          element =>
            element.element(by.tagName('h2')).getText()
            .then( text => [text,element] )
        )
      ).then(
        result=> {
          let [_,index] = result.map(
            ([text,element],index)=>[name === text,index]
          ).filter(
            ([hasText,index])=>hasText
          )[0];
          if(index !== undefined){
            return element(by.id('cartridge-' + index)).click();
          }
          else{
            return Promise.reject("could not find element");
          }
        }
      )
    }
  });
}

你可以跳过元素的循环,像这样从gettext()回调内部调用check-next元素

goToCartridge(name){
    let done = false;
    element(by.id('dashboard')).all(by.className('card z-depth-1')).then( elems => {
    function check(i) {
      if( i >= elems.length ) return;
      elems[i].element(by.tagName('h2')).getText().then( text => {
        if(name === text) {
          element(by.id('cartridge-' + i)).click();
        }
        else {
          check(i+1);
        }
      });
    }
    check(0);
  });
}

我建议重写如下内容:

goToCartridge(name) {
    $$('#dashboard .card.z-depth-1 h2').each((card, index) => {
        card.getText().then(text=> {
            if (name === text) {
                $(`cartridge-${index}`).click()
            }
        })
    })
}

我想您可以尝试调用-
元素(by.id('dashboard')).all(by.className('card z-depth-1')).getText()
,它将返回将解析为strings@Xotabu4我不知道,但这会使整个过程缩短很多。量角器用什么?这是selenium的噩梦还是其他东西?Gragrator内部使用官方WebdriverJS绑定,但为元素提供了一些扩展,如ElementFinder和ElementArrayFinder-