我正在尝试一段代码来遍历id
的数组以检查不同的链接,并且每个tiem必须打开相同的URL。像这样:
url = "www.google.com"
linksarray.forEach(function (linkChosen){
browser.get(url);
console.log("url", url)
element(by.id(linkchosen).click()
// perform some action to check if link was clicked
console.log("here")
browser.refresh() //should clear the actions performed by clicking on the link
console.log("done")
}
但是该页面仅打开一次,第二个循环失败,因为该元素从未被单击(无法重新刷新并再次打开该网址),因此它无法执行操作-我在这里缺少什么。同样,即使在第一次打开url之前,foreach也会打印here
和done
两次(因为数组中有2个元素)。如何使其等待并随浏览器流程一起执行?
答案 0 :(得分:1)
这里的问题是,您正在执行异步代码。例如,browser.get(url)
是异步的,并返回一个Promise
对象。您的代码在browser.get()
甚至打开URL之前就已完成执行。
使用Promises
处理时,您可以使用then()
或resp。 catch()
或await
。以下2个摘要的功能完全相同。
1)使用then
:
// ...
t.it('myTest', function() {
linksarray.forEach(function (linkChosen) {
browser.get(url).then(function() {
console.log("url", url);
element(by.id(linkchosen).click().then(function () {
console.log('element clicked');
browser.refresh().then(function () {
console.log("done");
});
});
});
});
});
2)使用await
(可在每个异步函数中使用。)
// ...
t.it('myTest', async function() {
await linksArray.forEach(async function(linkChosen) {
await browser.get(url);
console.log("url", url);
await element(by.id(linkChosen)).click();
console.log('element clicked');
await browser.refresh();
console.log("done");
});
}
您应该考虑花一些时间并学习有关Promise
课的基础知识。使用异步代码是必要的知识。