使用量角器测试页面上的所有链接

时间:2016-11-15 05:40:51

标签: javascript selenium selenium-webdriver protractor karma-jasmine

我已经能够在java中解决这个问题,但到目前为止我只能使用jasmine js打开网页。在java中,所有锚标记链接都可以保存在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]));
    }
  }
}

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

3 个答案:

答案 0 :(得分:1)

要获取所有链接,请在getAttribute上致电ElementArrayFinder。它将返回一个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);
    })
  );

答案 1 :(得分:0)

请参阅以下代码。

$$('a').map(function(link) {
    return link.getAttribute("href").then(function (href) {
        return href.replace(/https\:\/\/app\.perflectie\.nl\//g, localhost);
    });
}).then(function(links) {
    links.forEach(function(link) {
        browser.get(link);
        expect(browser.getCurrentUrl()).not.toContain('/Error/');
    });
});

有关更多信息,请访问以下链接。

Link 1

Link 2

希望这会有所帮助。 :)

答案 2 :(得分:0)

 it('link elements', function () {
    browser.ignoreSynchronization = true;
    browser.get('https://www.google.co.in');
    element.all(by.tagName('a')).each(function (elem) { // this is the important step, rest you can do whatever you want inside this
        elem.getText().then(function (val) {
            console.log('@@@@ : ' + val)
        })
    })
});