Sử dụng:
Ruby: ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
Rails: 3.2.9
Capybara: 2.0.3
Tôi có một ứng dụng Rails trong đó có một liên kết mà khi được nhấp vào sẽ gửi yêu cầu đăng AJAX và trả lại phản hồi JS.
Mã liên kết:
link_to("Send Notification", notification_path(user_id: user_id), remote: true, method: :post)
Phản hồi JS (tệp .js.haml) sẽ chuyển đổi div ẩn sau trên trang mà liên kết tồn tại:
Nội dung tệp js.haml:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Tôi đang thử nghiệm kịch bản gửi thông báo và hiển thị thông báo trạng thái thông báo cho người dùng bằng cách sử dụng Cucumber ( đá quý dưa chuột-rails với hỗ trợ Capybara được tích hợp sẵn )
Tôi đang cố gắng kiểm tra xem phần tử có id: notification_status hiển thị khi phản hồi thành công trong định nghĩa bước của tôi. Để làm được điều này, tôi đã thử các câu lệnh sau:
page.find('#notification_status').should be_visible
page.should have_selector('#notification_status', visible: true)
page.should have_css('#notification_status', visible: true)
page.find('#notification_status', visible: true)
page.find(:css, 'div#notification_status', visible: true)
Không có cách nào ở trên phù hợp với tôi và không thực hiện được bước của tôi. Trong số 5 đoạn mã được liệt kê ở trên, 4 đoạn mã cuối cùng không thành công với lỗi sau:
'expected to find css "#notification_status" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)'
điều này thật kỳ lạ vì câu lệnh sau đã được chuyển đúng cách:
page.has_selector?('#notification_status')
Và trên thực tế, tôi đã kiểm tra nguồn trang bằng cách sử dụng
print page.html
mà đã xuất hiện
<div style='' id='notification_status'></div>
mà đã được mong đợi.
Cuối cùng, tôi tìm thấy liên kết này capybara khẳng định thuộc tính của một phần tử hiển thị cách kiểm tra thuộc tính của phần tử theo cách thô.
Tôi cũng tìm thấy trong tài liệu Capybara cho hiển thị? phương thức ( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method ) thông tin sau:
Not all drivers support CSS, so the result may be inaccurate.
Vì vậy, tôi đã đi đến kết luận rằng khi kiểm tra khả năng hiển thị của một phần tử không dựa vào kết quả của khả năng hiển thị của Capybara? khi sử dụng bộ chọn CSS và sử dụng giải pháp được đề xuất trong liên kết capybara xác nhận thuộc tính của một phần tử
Tôi đã nghĩ ra sau:
module CustomMatchers
def should_be_visible(css_selector)
find(css_selector)['style'].should_not include('display:none', 'display: none')
end
end
World(CustomMatchers)
Sử dụng:
should_be_visible('#notification_status')