angularjs - Protractor 期望元素最终出现

标签 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(至少目前如此)。

最佳答案

利用事实

  • browser.wait返回一个 Promise,一旦条件函数返回 true,该 Promise 就会被解决;如果超时,该 Promise 将被拒绝。

  • 如果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 原型(prototype)进行猴子修补

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}在 Protractor 配置文件中

关于angularjs - Protractor 期望元素最终出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37139499/

相关文章:

javascript - 通过识别同一行中的另一个单元格值,单击行值中的元素

javascript - 在 Protractor 的哪里放置 implicitlyWait?

javascript - 验证电子邮件唯一性时的 AngularJS/奇怪行为

javascript - AngularJS 中如何将数据从一个异步函数传递到另一个异步函数

angular - 如何在组件中模拟 ngrx 选择器

javascript - Angular 2/Jasmine 测试输入字段绑定(bind)

angular - 我如何使用 ngRedux 测试服务

Protractor - 在运行时更改浏览器功能

angularjs - 如何将参数从 AngularJS 指令传递到 AngularJS Controller 函数

javascript - 如果其主页在 angularJS 中,则添加类