量角器期望元素最终存在

时间:2016-05-10 13:07:49

标签: angularjs jasmine protractor e2e-testing

有没有办法期望元素最终在页面上?例如

的一种方式
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(至少目前为止)。

2 个答案:

答案 0 :(得分:4)

使用

的事实
  • browser.wait返回一个在条件函数返回真值后解析的promise,如果超时则会被拒绝。

  • 如果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}

答案 1 :(得分:2)

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

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

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

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

作为旁注,重要的是提供有意义的自定义错误描述,就像您已经做过的那样。如果您要强制执行此操作,则eslint-plugin-protractor pluginESLint静态代码分析工具would warn you如果使用了browser.wait()而没有明确的错误说明文字。