测试某些元素是否可见

cal*_*tie 33 angularjs karma-runner

如何确定元素在testacular(jasmine)中是否可见或隐藏?

我的DOM看起来像:

<div class="span5 value-entry">
    <input type="text" ng-model="query.value" placeholder="Enter value" class="input-large" ng-show="genericInput(criteria.attribute)">
    <select ng-model="query.value" ng-options="entry for entry in filteredValue(criteria.attribute)" class="input-medium" ng-show="!genericInput(criteria.attribute)">
        <option value="">-- Select Value --</option>.
    </select>
</div>
Run Code Online (Sandbox Code Playgroud)

显示选择或输入框,但不是两者.我希望检查哪个元素是可见的(基于其他一些标准),但我似乎无法弄清楚如何使代码工作.我写了以下代码:

expect(element('.value-entry input').is(':visible')).toBe(true);
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

TypeError: Object #<Object> has no method 'is'
Run Code Online (Sandbox Code Playgroud)

如何检查输入是否可见并且同时隐藏选择(反之亦然)?

编辑:我想在此添加这是一个端到端测试

geo*_*osd 52

Angular 1.2中的此行为已更改,因为ng-animate.

代码ngShow是:

var ngShowDirective = ['$animate', function($animate) {
  return function(scope, element, attr) {
    scope.$watch(attr.ngShow, function ngShowWatchAction(value){
      $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');
    });
  };
}];
Run Code Online (Sandbox Code Playgroud)

这意味着它将添加/删除类ng-hide来隐藏/显示元素.

因此,作为一个例子,测试元素是否被隐藏的正确方法是:

expect(element.find('.value-entry input').hasClass('ng-hide')).toBe(true);
Run Code Online (Sandbox Code Playgroud)

  • 这应该是新的答案,因为隐藏元素的方式发生了变化.但是,使用.hasClass()方法可能会更容易一些. (4认同)

Sha*_*ged 14

你很亲密 但是,您应该如何测试可见性:

expect(element('#some-id:visible').count()).toBe(1);
Run Code Online (Sandbox Code Playgroud)


Bre*_*row 6

可见性测试

默认情况下,显示设置inline为输入和inline-block选择.因此,您可以通过测试是否存在默认CSS属性来确定当前是否显示任何一个.

expect(element('.value-entry input').css('display')).toBe('inline');
expect(element('.value-entry select').css('display')).toBe('inline-block');
Run Code Online (Sandbox Code Playgroud)

检查是否隐藏,替换inlineinline-block检查none,这是ngShow隐藏元素的方式.

expect(element('.value-entry input').css('display')).toBe('none');
expect(element('.value-entry select').css('display')).toBe('none');
Run Code Online (Sandbox Code Playgroud)

  • 该测试与ng-show的实施紧密相关,这增加了脆性.使用'Shadowedged'建议的选择器来识别可见元素会延迟可见性测试逻辑,并使测试远离实现. (3认同)