2013-04-15 87 views
29

如何确定某个元素是否可见或隐藏在唾液(茉莉花)中?测试某些元素是否可见

我的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> 

要么选择显示或输入框,但不能同时使用。我想检查哪些元素是可见的(基于其他标准),但我似乎无法弄清楚如何让代码工作。我写了下面的代码:

expect(element('.value-entry input').is(':visible')).toBe(true); 

但我得到一个错误:

TypeError: Object #<Object> has no method 'is' 

如何检查,如果输入的是可见的,并且选择在同一时间(反之亦然)隐藏?

编辑:我想在这里补充一点,这是一个端到端的测试

+0

参见这个问题:http://stackoverflow.com/questions/16703276/angular-watch- for-ngshow-nghide-changes-in-ancestors-that-affect-child-dom-ele这个解决方案也考虑到祖先的可见性 – lanoxx

回答

48

这种行为在角因为ng-animate 1.2改变。

代码为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'); 
    }); 
    }; 
}]; 

,这意味着它会添加/删除ng-hide类隐藏/显示的元素。

因此,作为一个例子,为了测试正确的方式,如果被隐藏在元件将是:

expect(element.find('.value-entry input').hasClass('ng-hide')).toBe(true); 
+4

这应该是新的答案,因为事物已经改变了元素的隐藏方式。但是,使用.hasClass()方法可能会更容易一些。 – chris

+0

茉莉花里有'hasClass()'? – georgiosd

+0

@georgiosd:angular.element有一个_hasClass_方法 – null

6

能见度测试

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

expect(element('.value-entry input').css('display')).toBe('inline'); 
expect(element('.value-entry select').css('display')).toBe('inline-block'); 

要检查是否任一被隐藏,有用于none检查,这是怎么ngShow隐藏的元件替换inlineinline-block

expect(element('.value-entry input').css('display')).toBe('none'); 
expect(element('.value-entry select').css('display')).toBe('none'); 
+2

这个测试与ng-show的实现密切相关,这增加了脆性。使用'Shadowedged'建议的选择器来识别可见元素会推迟可见性测试逻辑,并让您的测试远离实现。 – daddywoodland

+0

这是非常有意义的,但是,我一直在获取元素不是函数中的一个类型错误 – Winnemucca

14

你很近。然而,这里是你应该如何测试知名度:

expect(element('#some-id:visible').count()).toBe(1); 
+1

** Heads up!**这只会在你包含jQuery的情况下才起作用,否则这不会产生如下类似错误:通过选择器查找元素不被jqLit​​e!'支持!查看更多细节:http://embed.plnkr.co/g5ZdYpLrKWR1u8R0GOB9/(不要忘记打开控制台)。 –