量角器适用于规格DRY

时间:2014-12-20 14:41:41

标签: javascript for-loop asynchronous protractor dry

我们有一个带有行网格的应用程序,具有每页SELECT和Pagination,并且想要执行导航和PP选择的e2e测试然后通过将其与DB的结果(伪代码)进行比较来检查显示的结果):

it('should check navigation and pp', function() {
  for(i=0;i<SELECT.options;i++) {
    element(by.repeater('SELECTOR HERE(i)')).click();
    browser.wait(function which checks URL contains a segment(i));
    browser.wait(function which checks if a 'loading div is displayed');
    for(j=0;j<PagesForPP(i);j++) {
      runExpects('for pp=i'); //contains a couple expect(someElement.text).toContain(asynResult());
      element(by.css('SELECTOR(j)').click();
      browser.wait(function which checks URL contains a segment(j));
      browser.wait(function which checks 'loading div is displayed');
    }        
  }
});

其中function(i)是依赖于当前Perpage和函数(j)的调用

我的问题是:如何使用protractor.promise.controlFlow()或更好的方法(如果可用)以量角器理解(可能同步执行)的方式嵌套这两个循环。

目前,量角器忽略了browser.wait(检查URL包含段(i)的函数)等函数; 看起来像这样:

waitForPageChange: function (urlSegment) {
  console.log('>> Waiting for URL to contain: ', urlSegment);
  var currentUrl;
  return browser.getCurrentUrl().then(function (url) {
    currentUrl = url;
  }).then(function () {
    browser.wait(function () {
      return browser.getCurrentUrl().then(function (url) {
        if (urlSegment) {
          return url.indexOf(urlSegment) >= 0;
        }
        return url !== currentUrl;
      });
    });
  });
}

e2e测试在预期有效之前完成(例如:我们已经在第1页,我们已经达到2页和3页检查=&gt;所有测试都失败了,因为他们已经检查错误的值。

1 个答案:

答案 0 :(得分:1)

我认为你的waitForPageChange方法应该有效。我相信你错过了一个“return”(来自browser.wait),所以函数中的最后then(这是整个函数的返回值)不是正确的承诺。试试这个:

waitForPageChange: function (urlSegment) {
  console.log('>> Waiting for URL to contain: ', urlSegment);
  var originalUrl;
  return browser.getCurrentUrl().then(function (url) {
    originalUrl = url; // XXX this is racy, the page may have changed already
  }).then(function () {
    return browser.wait(function () { // this line was missing a 'return'
      return browser.getCurrentUrl().then(function (url) {
        if (urlSegment) {
          return url.indexOf(urlSegment) >= 0;
        }
        return url !== originalUrl;
      });
    });
  });
}

请注意,执行return muble.then(...).then(function() {return x; })的代码最终会从链中的 last then返回承诺。

另外,请注意未提供urlSegment的默认情况。您无法确定“originalUrl”是否足够快地初始化。浏览器可能会在您加载之前继续前进。为了可靠,您可能需要一个单独的“waitForPageToLeave(x)”等待URL更改远离提供的URL,并且您应该期望调用者在进行任何更改之前查找该“原始”URL。 (这将与等待URL成为给定URL的“waitForPageToGoTo(x)”函数分开。)