量角器期望元素最终出现

Protractor expectation that element is eventually present

有没有办法让元素最终出现在页面上?例如

的一种方式
browser.wait(protractor.ExpectedConditions.presenceOf(element(by.partialLinkText('Continue'))), 1000, 'Unable to find continue link');

因预期错误而不是超时而失败?本质上是一种在下面的行中使用 isEventuallyPresent() 而不是 isPresent() 的方法

expect(element(by.partialLinkText('Continue')).isPresent()).toBe(true);

作为参考,我正在使用 browser.ignoreSynchronization = true 尽管它是一个 Angular 应用程序,并且使用 Jasmine(至少现在是这样)。

browser.wait() 一起使用的 presenceOf 预期条件 将允许在测试中有一行:

var EC = protractor.ExpectedConditions;
browser.wait(EC.presenceOf(element(by.partialLinkText('Continue'))), 1000, 'Unable to find continue link');

其中 ECprotractor.ExpectedConditions - 我通常通过 global 命名空间 onPrepare() 中。

请注意,如果出现故障,您将遇到 超时错误 ,但会出现 Unable to find continue link 错误描述。


作为旁注,提供有意义的自定义错误描述很重要,就像您已经做的那样。如果你想强制执行它,有一个 eslint-plugin-protractor plugin to ESLint static code analysis tool that would warn you 如果有一个 browser.wait() 使用没有明确的错误描述文本。

利用

的事实
  • browser.wait returns 一旦条件函数 returns 为真就解决的承诺,如果超时则拒绝。

  • 如果expect传递了一个承诺,它只会在承诺被解决时运行期望

您可以创建一个函数来包装对 browser.wait

的调用
function eventual(expectedCondition) {
  return browser.wait(expectedCondition, 2000).then(function() {
    return true;
  }, function() {
    return false;
  });
}

然后创造一个期望

expect(eventual(protractor.ExpectedConditions.presenceOf(element(by.partialLinkText('Continue'))))).toBe(true);

或者,要使其在任何浏览器实例上运行,您可以对 Protractor 原型进行猴子修补

protractor.Protractor.prototype.eventual = function(expectedCondition) {
  return this.wait(expectedCondition, 2000).then(function() {
    return true;
  }, function() {
    return false;
  });
}

并可用作

expect(browser.eventual(protractor.ExpectedConditions.presenceOf(element(by.partialLinkText('Continue'))))).toBe(true);

为避免超时,必须确保传递给 browser.wait 的超时小于 Jasmine 异步测试超时,在量角器配置文件中指定为 jasmineNodeOpts: {defaultTimeoutInterval: timeout_in_millis}