量角器点击元素数组
Protractor clicking through an array of elements
我对端到端测试和使用量角器/茉莉花框架还很陌生。我知道如何获取元素数组以及如何单击锚点。但是如何/甚至可能点击元素选择器/转发器返回的锚点列表?
我一直在尝试各种方法,但作为一个例子(最新的还没有被删除哈哈)这就是我得到的:
element.all(by.repeater('link in links')).then(function(links) {
links.forEach(function(link) {
link.click().then(function() {
console.log('callback for click ');
});
});
});
这似乎采用了第一个元素并点击通过,但是下一次迭代它挂起(我明白为什么,但正在努力寻找解决方法 - 这是我需要的某种承诺和解决因素吗考虑到?)
返回的错误是
Failed: stale element reference: element is not attached to the page document
任何指导/link 帮助将不胜感激 - 谷歌搜索到目前为止还没有返回任何值得注意的东西...
提前致谢!
设法想出了一个解决方法,尽管这感觉不太对。无论如何,如果有人有更好的建议,请随时 post :)
element.all(by.repeater('link in links')).map(
function(link, index) {
return {
index: index,
href: link.getAttribute('href')
};
})
.then(function(links) {
for (var i = links.length - 1; i >= 0; i--) {
browser.get(links[i].href);
// do some page specific stuff here.
};
});
为了避免 "staleness" 问题,您必须获得一个 href
已解析属性值的数组,map()
+then()
可以帮助您(因为您已经提供)。你只是不需要 index
并且你可以从第一个开始迭代链接:
element.all(by.repeater('link in links')).map(function(link) {
return link.getAttribute('href');
}).then(function(links) {
for (var i = 0; i < links.length; i++) {
browser.get(links[i]);
}
});
解决方案01
public findSpecificElementAndClick(element: ElementArrayFinder,expected: number){
let clickedIndex: number = -1;
element.filter(function (elementItem, index) {
clickedIndex++;
if(index === (expected-1)){
element.get(clickedIndex).click();
return true;
}
}).then(function (bool) {
}).catch(function (err) {
throw new FrameworkException('Ooops ! Error... '+err.message);
});
}
解决方案02
public findTextAndClick(element: ElementArrayFinder,expected: string) {
let clickedIndex: number = -1;
let status :boolean = false;
element.filter(function (elementItem, index) {
return elementItem.getText().then(function (text) {
if(text === expected) {
clickedIndex = index;
status = true;
return true;
}
});
}).then(function (bool) {
if(!status){
throw new ApplicationException("Ooops ! Couldn't found "+expected+" Record ...");
}else{
element.get(clickedIndex).click();
}
}).catch(function (err) {
throw new FrameworkException('Ooops ! Error... '+err.message);
});
}
我对端到端测试和使用量角器/茉莉花框架还很陌生。我知道如何获取元素数组以及如何单击锚点。但是如何/甚至可能点击元素选择器/转发器返回的锚点列表?
我一直在尝试各种方法,但作为一个例子(最新的还没有被删除哈哈)这就是我得到的:
element.all(by.repeater('link in links')).then(function(links) {
links.forEach(function(link) {
link.click().then(function() {
console.log('callback for click ');
});
});
});
这似乎采用了第一个元素并点击通过,但是下一次迭代它挂起(我明白为什么,但正在努力寻找解决方法 - 这是我需要的某种承诺和解决因素吗考虑到?)
返回的错误是
Failed: stale element reference: element is not attached to the page document
任何指导/link 帮助将不胜感激 - 谷歌搜索到目前为止还没有返回任何值得注意的东西...
提前致谢!
设法想出了一个解决方法,尽管这感觉不太对。无论如何,如果有人有更好的建议,请随时 post :)
element.all(by.repeater('link in links')).map(
function(link, index) {
return {
index: index,
href: link.getAttribute('href')
};
})
.then(function(links) {
for (var i = links.length - 1; i >= 0; i--) {
browser.get(links[i].href);
// do some page specific stuff here.
};
});
为了避免 "staleness" 问题,您必须获得一个 href
已解析属性值的数组,map()
+then()
可以帮助您(因为您已经提供)。你只是不需要 index
并且你可以从第一个开始迭代链接:
element.all(by.repeater('link in links')).map(function(link) {
return link.getAttribute('href');
}).then(function(links) {
for (var i = 0; i < links.length; i++) {
browser.get(links[i]);
}
});
解决方案01
public findSpecificElementAndClick(element: ElementArrayFinder,expected: number){
let clickedIndex: number = -1;
element.filter(function (elementItem, index) {
clickedIndex++;
if(index === (expected-1)){
element.get(clickedIndex).click();
return true;
}
}).then(function (bool) {
}).catch(function (err) {
throw new FrameworkException('Ooops ! Error... '+err.message);
});
}
解决方案02
public findTextAndClick(element: ElementArrayFinder,expected: string) {
let clickedIndex: number = -1;
let status :boolean = false;
element.filter(function (elementItem, index) {
return elementItem.getText().then(function (text) {
if(text === expected) {
clickedIndex = index;
status = true;
return true;
}
});
}).then(function (bool) {
if(!status){
throw new ApplicationException("Ooops ! Couldn't found "+expected+" Record ...");
}else{
element.get(clickedIndex).click();
}
}).catch(function (err) {
throw new FrameworkException('Ooops ! Error... '+err.message);
});
}