2013-04-15 35 views
29

Làm cách nào để tìm hiểu xem một phần tử có thể nhìn thấy hoặc ẩn trong chữ hoa nhài (hoa nhài)?Kiểm tra xem các thành phần nhất định có hiển thị hay không

DOM của tôi trông giống như:

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

Hoặc là chọn được hiển thị hoặc hộp đầu vào, nhưng không phải cả hai. Tôi muốn kiểm tra xem phần tử nào có thể nhìn thấy (dựa trên một số tiêu chí khác), nhưng tôi dường như không thể tìm ra cách để mã hoạt động. Tôi đã viết đoạn mã sau:

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

Nhưng tôi nhận được một lỗi:

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

Làm thế nào để kiểm tra xem các đầu vào là có thể nhìn thấy và chọn được giấu tại cùng một thời gian (và ngược lại) ?

EDIT: Tôi muốn thêm ở đây rằng đây là dấu chấm hết cho kết thúc thử nghiệm

+0

Xem thêm những câu hỏi này: http://stackoverflow.com/questions/16703276/angular-watch- for-ngshow-nghide-thay đổi-trong-tổ tiên-đó-ảnh hưởng-con-dom-ele cho một giải pháp mà cũng xem xét khả năng hiển thị tổ tiên – lanoxx

Trả lời

48

Hành vi này đã thay đổi ở góc 1,2 do ng-animate.

Mã này cho ngShow là:

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

Có nghĩa là nó sẽ thêm/gỡ bỏ các lớp ng-hide để ẩn/hiển thị phần tử.

Như vậy, làm ví dụ, đúng cách để kiểm tra xem các phần tử được ẩn sẽ là:

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

Đây sẽ là câu trả lời mới, vì mọi thứ đã thay đổi trong cách các phần tử bị ẩn.Tuy nhiên, sử dụng phương thức .hasClass() có thể dễ dàng hơn một chút trên đôi mắt. – chris

+0

Có một 'hasClass()' trong Jasmine? – georgiosd

+0

@georgiosd: angular.element có phương thức _hasClass_ – null

6

Tầm nhìn thử

Theo mặc định, màn hình được thiết lập để inline cho đầu vào, và inline-block cho chọn. Do đó, bạn có thể xác định liệu một trong hai hiện có được hiển thị hay không bằng cách kiểm tra sự tồn tại của thuộc tính CSS mặc định.

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

Để kiểm tra nếu một trong hai được ẩn, thay thế inlineinline-block với một tấm séc cho none, đó là cách ngShow ẩn một phần tử.

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

Thử nghiệm này được gắn chặt chẽ với việc thực hiện ng-show cho biết thêm brittleness. Sử dụng công cụ chọn được đề xuất bởi 'Bóng mờ' để xác định các yếu tố có thể nhìn thấy sẽ ngăn chặn logic kiểm tra mức độ hiển thị và giữ cho các thử nghiệm của bạn xa hơn khi triển khai. – daddywoodland

+0

Điều này làm cho cảm giác hoàn hảo, tuy nhiên, tôi tiếp tục nhận được phần tử không phải là một chức năng trong một lỗi loại – Winnemucca

14

Bạn thân thiết. Tuy nhiên, dưới đây là cách bạn nên kiểm tra khả năng hiển thị:

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

** Cảnh báo! ** Điều này sẽ chỉ hoạt động nếu bạn có jQuery bao gồm, nếu không điều này sẽ không hoạt động ném một lỗi tương tự như: ' Tìm kiếm các phần tử thông qua các bộ chọn không được hỗ trợ bởi jqLite! 'Kiểm tra ở đây để biết thêm chi tiết: http://embed.plnkr.co/g5ZdYpLrKWR1u8R0GOB9/ (đừng quên mở giao diện điều khiển). –

Các vấn đề liên quan