量角器遍历数组并打开url

时间:2018-06-26 02:32:23

标签: javascript protractor

我正在尝试一段代码来遍历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也会打印heredone两次(因为数组中有2个元素)。如何使其等待并随浏览器流程一起执行?

1 个答案:

答案 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课的基础知识。使用异步代码是必要的知识。