【问题标题】:protractor proper DRY for spec量角器适当干燥规格
【发布时间】:2014-12-20 14:41:41
【问题描述】:

我们有一个带有行网格的应用程序,具有每页选择和分页,并希望进行 e2e 测试,该测试执行导航和 PP 选择,然后通过将其与 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 和 function(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 页检查 => 所有测试都失败了,因为它们正在检查不正确的值。

【问题讨论】:

    标签: javascript for-loop asynchronous protractor dry


    【解决方案1】:

    我认为您的waitForPageChange 方法应该可行。我相信您缺少“返回”(来自 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; }) 的代码最终会从链中的最后一个 then 返回承诺。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多