javascript - 使用 Protractor 测试页面上的所有链接

标签 javascript selenium selenium-webdriver protractor karma-jasmine

我已经能够在 java 中解决这个问题,但到目前为止我只能使用 jasmine js 打开网页。在java中,所有的 anchor 标签链接都可以保存在List中,然后每个链接都可以使用浏览器驱动对象进行导航。但是在 jasmine js 中,我无法将这些链接存储在数组中。这是我尝试做的事情:

describe('demo', function()
{
  it('mydemo', function()
  {
    browser.ignoreSynchronization = true;
    browser.driver.get('https://www.google.co.in');
    var array = [];
    array.push(browser.findElement(by.xpath("//a[@href]")));

    for(var i=0; i<array.length; i++)
    {
        expect(browser.navigate().to(array[i]));
    }
  }
}

弹出一个新的浏览器窗口,导航到 google,然后关闭。似乎存在超时问题。使用 browser.ignoreSynchronization = true,服务器将其作为 Angular 应用程序忽略,但超时问题仍然存在。有什么建议吗?

最佳答案

要获取所有链接,请在 ElementArrayFinder 上调用 getAttribute。它将返回一个 Promise,一旦解决,它将为您提供所有链接。 然后调用 filter 排除动态链接 (href="javascript:...) 并调用 forEach 迭代每个链接:

browser.ignoreSynchronization = true;

$$("a[href]").getAttribute("href")
  .then(links => links
    .filter(link => !/^javascript/.test(link))
    .forEach(link => {
      console.log(link);
      browser.driver.get(link);
    })
  );

另一种更快的方法是通过一次调用浏览器来获取所有带有执行脚本的链接:

browser.ignoreSynchronization = true;

browser.driver.executeScript("return [].map.call(document.links, function(e){return e.href})")
  .then(links => links
    .filter(link => !/^javascript/.test(link))
    .forEach(link => {
      console.log(link);
      browser.driver.get(link);
    })
  );

关于javascript - 使用 Protractor 测试页面上的所有链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40602793/

相关文章:

javascript - 如何验证 JavaScript 中的中缀表示法?

javascript - JavaScript 中的 for 循环/赋值

C# 和 Selenium : selectByText using a dropdownlist

java - jacoco agent on wildfly - 0% 覆盖类(class)

python - 使用文本 selenium beautifulsoup python 获取标签

javascript - 正则表达式:两个带换行符的字符串之间的匹配数字

javascript - HtmlUnit - 如何显示 iframe 内容

python - Selenium 在元素中查找元素

python - 在 'For' 循环内调用函数会抛出 NameError

java - 使用 dataprovider 的 TestNG 并行测试/方法