3

我正在用 Angular 编写端到端测试,我想验证一个 DOM 元素相对于另一个 DOM 元素的位置。幸运的是,Angular E2E DSL 为 jQuery 的 offset() 方法提供了一个直通方法。非常适合我的用例!

但是,我很困惑如何使用此方法返回的对象。对 offset() 的调用返回一个具有topleft属性的对象。当我尝试在测试中访问这些属性时,Angular 会抱怨。

这段代码很好用:

expect(element("#anID").offset()).toEqual({"top":100,"left":100});

此代码不起作用,并引发错误:

expect(element("#anID").offset().top).toEqual(100);

TypeError: Cannot read property 'name' of undefined
    at Object.angular.scenario.matcher.(anonymous function) (http://localhost:8000/test/angular/angular-scenario.js:23994:41)
    at Object.executeStatement (http://localhost:8000/test/angular/angular-scenario.js:23960:30)
    at Object.chain.(anonymous function) [as toEqual] (http://localhost:8000/test/angular/angular-scenario.js:23968:37)
    at Object.<anonymous> (http://localhost:8000/test/E2E-scenarios.js:78:53)

如何使用 offset() 的返回来构造一个大致如下的期望:

expect(element("#anID").scrollTop() - element("#anotherID").offset().top).toEqual(100);

更新

在与 Josh David Miller 反复讨论之后,我发现我真正的问题是:如何在 expect() 调用之外获取 angular.scenario.Future 对象的值,这样我就可以将其用作其他期望的基础?

4

2 回答 2

3

在Angular 邮件列表中找到了答案。这样的事情将适用于在单个期望中使用多个 angular.scenario.Future 对象值:

  it('async expectation', function() {
    browser().navigateTo('index.html');
    var relativeElement = element("#anID").prop( 'offsetTop' )

    this.addFuture('ScenarioRunner step title', function(done) {
      expect(element('#anotherID').scrollTop()).toEqual(relativeElement.value - 100);
      done();
    });
  });

angular github repo上有一个问题可以更优雅地集成到 ScenarioRunner 中。

于 2013-02-11T21:40:36.100 回答
2

你实际上不应该需要 jQuery passthrough。这应该可以正常工作:

expect( element.prop( 'offsetLeft' ) ).toEqual( 361 );
expect( element.prop( 'offsetTop' ) ).toEqual( 451 );

如果没有,您可以在 jsfiddle 或 plunker 上发布一个完整的最小示例吗?

于 2013-01-28T20:41:56.707 回答