重定向到另一个页面后循环中的陈旧元素引用
stale element references in loop after redirection to another page
我试图在我的 e2e 测试中选择网站上类似对象的某个元素,然后单击它然后切换到与该元素相关的另一个站点。问题是页面更改后循环仍在继续,因为 promise 解决了异步问题(我是所有这些东西的新手)
这里是代码:
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;
});
}
});
}
如何在下一次迭代开始之前等待循环内的异步部分?我搜索了很多解决方案,但还没有找到。
也许这行得通,我将 for 循环更改为 array.map 并过滤。不确定 Array.from 是否适用于榆树:
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");
}
}
)
}
});
}
你可以跳过 elems 的循环并像这样从 gettext() 回调中调用检查 elems 的下一个元素
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()
}
})
})
}
我试图在我的 e2e 测试中选择网站上类似对象的某个元素,然后单击它然后切换到与该元素相关的另一个站点。问题是页面更改后循环仍在继续,因为 promise 解决了异步问题(我是所有这些东西的新手)
这里是代码:
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;
});
}
});
}
如何在下一次迭代开始之前等待循环内的异步部分?我搜索了很多解决方案,但还没有找到。
也许这行得通,我将 for 循环更改为 array.map 并过滤。不确定 Array.from 是否适用于榆树:
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");
}
}
)
}
});
}
你可以跳过 elems 的循环并像这样从 gettext() 回调中调用检查 elems 的下一个元素
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()
}
})
})
}