【问题标题】:testing all the links on a page using protractor使用量角器测试页面上的所有链接
【发布时间】:2016-11-15 05:40:51
【问题描述】:

我已经能够在 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]));
    }
  }
}

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

【问题讨论】:

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


    【解决方案1】:

    要获取所有链接,请在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);
        })
      );
    

    【讨论】:

      【解决方案2】:

      参见下面的代码。

      $$('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

      希望这会有所帮助。 :)

      【讨论】:

        【解决方案3】:
         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)
                })
            })
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 2017-09-16
          相关资源
          最近更新 更多