【问题标题】:Protractor expectation that element is eventually present量角器期望元素最终存在
【发布时间】:2016-09-05 11:44:13
【问题描述】:

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

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(至少现在是这样)。

【问题讨论】:

  • 不确定我是否完全理解,但我现在会发表评论——Expected Conditionslink here 下的任何内容都可以解决您的问题吗?特别是presenceOfvisibilityOf——我使用它们来等待Modal(因为它们仅在触发后才会动态附加到HTML),然后再开始测试执行。
  • 除此之外 - 您可以使用 stalenessOf 来确保元素 存在于 DOM 中,然后使用上面列出的其他元素确保它稍后存在。

标签: angularjs jasmine protractor e2e-testing


【解决方案1】:

使用事实

  • browser.wait 返回一个承诺,一旦条件函数返回真值,该承诺即被解决,如果超时则被拒绝。

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

你可以创建一个函数来包装对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}

【讨论】:

  • 把它包装成一个可重用的函数是个好主意!
【解决方案2】:

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

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

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

请注意,如果发生故障,您将遇到超时错误,但带有Unable to find continue link 错误描述。


作为旁注,提供有意义的自定义错误描述很重要,正如您已经做过的那样。如果你想强制执行它,有一个eslint-plugin-protractor pluginESLint 静态代码分析工具would warn you 如果有一个browser.wait() 使用没有明确的错误描述文本。

【讨论】:

  • 感谢您的回答...但是我意识到我 a) 在原始问题中错过了“presenceOf”,并且 b) 并没有真正提出正确的问题来获得我想要的答案。不完全确定它是否已经完成,但我已经编辑了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多