【问题标题】:DRYing up protractor clicks tests using a For-Loops使用 For-Loops 干燥量角器点击测试
【发布时间】:2014-12-02 20:45:02
【问题描述】:

问题: 如何在一次测试中点击ul > li a 中的每个链接?

问题:这个测试通过了;但是,它没有点击链接。我知道这一点是因为它没有重定向或等待 2000 毫秒。

测试:

  it("should have proper page linking to all footer link", function() {
      browser.driver.sleep(2000);
      browser.ignoreSynchronization = true;
      //creates an array of strings of all the menu items
      var titles = element.all(by.css('.leftMenu.first .submenu li a'))
          .map(function(elm) {
              return elm.getText().then(function(text){
                 return text;
              });
          });

      //iterates through the links via titles array
      for (var i = 0; i < titles.length; i++) {
          // creates a link via selection of cssContainText of the titles array
          var link = element(by.cssContainingText('.submenu li a', titles[i]));

          //click event
          link.click().then(function() {
              browser.driver.sleep(2000);
              //currently arbitrary expectation but will pass
              expect(browser.driver.getTitle()).toBe('welcome to: ' + title[i]);
          });

      }

  });

更新:找到答案:ANSWER

【问题讨论】:

标签: javascript selenium selenium-webdriver protractor angularjs-e2e


【解决方案1】:

上述答案和方法似乎都采用“同步”方法,所以我想提供我为使用标准异步量角器方法的同一问题找到的解决方案。

在此示例中,页脚链接是文本链接,例如“ABOUT”、“CONTACT”等 - 这些链接映射到“/about”和“/contact”等 URL。

编辑:ptor 是之前从 protractor.getInstance() 定义的;

it('should have a working set of footer links to internal pages', function() {
  // element.all( -your selectors- )
  // .then() is passed an ARRAY of element finders 
  element.all(by.css('.footer .nav .links')).then(function(elems) {

    // for each element .getText() returns a promise
    var txts = elems.map(function(elem) {
      return elem.getText().then(function(txt) {
        if(txt != ''){
          return txt;
        }
      });
    });

    // txts is now an ARRAY of promises
    // When they are ALL fulfilled the loop below is run
    protractor.promise.all(txts).then(function(links) {
      for (var i=0; i<links.length; i++) {
        // reset browser back to page of interest
        // the home page in this case
        browser.get('/');

        // get a fresh instance of the element and click it
        // attempts to click pre-created element list
        // will result in 'stale' elements references as pages
        // are being navigated
        element.all(by.css('.footer .nav .links')).get(i).click();

        // expectation of navigation
        expect(ptor.getCurrentUrl()).toContain(links[i].toLowerCase());
      }
    });

  });

});

【讨论】:

    【解决方案2】:

    复制:ANSWER HERE

    您需要将 it 块包装在 IIFE 中以强制同步

    for(var i=0; i < testParams.length; i++) {
    
        (function(testSpec) {
            it('write your test here', function() {
                //test code here
            }
        })(testParams[i]);
    
    };
    

    【讨论】:

      【解决方案3】:

      你的主要问题是:

      return elm.getText;
      

      getText 是一个返回承诺的方法。所以你需要的更像是

      return elm.getText().then(function(text){
          return text;
      });
      

      当你调用像 getText 或 getInnerHtml 这样的方法时,它只返回一个 Promise。如果你没有使用 expect,如果你希望 promise 被解析以获取值,你需要链接 then 来返回值。

      【讨论】:

      • 我并不是说这不是正确的返回方式;但是,点击事件仍然不起作用。 +1 努力。上面也更正了答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多