Tôi đang sử dụng RSpec2 và Capybara để kiểm tra chấp nhận.
Tôi muốn khẳng định rằng liên kết đó có bị vô hiệu hóa hay không trong Capybara. Tôi có thể làm cái này như thế nào?
Câu trả lời:
Làm thế nào để bạn vô hiệu hóa liên kết? Đó có phải là một lớp bạn đang thêm không? Một thuộc tính?
# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")
# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")
# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible
Các bộ chọn xpath thực tế có thể không chính xác. Tôi không sử dụng xpath thường xuyên!
Một giải pháp đơn giản khác là truy cập thuộc tính HTML mà bạn đang tìm kiếm []
:
find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"
find('a#my_element')['href']
# => "http://example.com
# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""
Lưu ý rằng Capybara
sẽ tự động cố gắng đợi các yêu cầu không đồng bộ kết thúc, nhưng nó có thể không hoạt động trong một số trường hợp:
Đây là một cách giải quyết nếu bạn gặp sự cố với các xác nhận trên các phần tử được cập nhật không đồng bộ:
find('a#my_element[href]')
, liệu có thể truy xuất giá trị của thuộc tính này không? Cố gắng với các biểu thức như find('a#my_element[href]').value
nhưng dường như không hiệu quả :(
find('a#my_element[href]').text
hoặc find('a#my_element[href]').native
. Hãy cho tôi biết nếu một trong hai cách đó mang lại kết quả như bạn mong đợi.
Có một chút lộn xộn để tìm ra đường dẫn chính xác, đây là đường dẫn chính xác,
sử dụng capybara 0.4.1.1
# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>
page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")
Nếu bạn chỉ có liên kết mà không có lớp, hãy sử dụng
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
Một cái gì đó như thế này sẽ không hoạt động một cách đáng buồn:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
Tùy chọn lớp học sẽ bị bỏ qua.
Tôi khuyên bạn nên sử dụng have_link
và find_link(name)[:disabled]
trong hai xác nhận riêng biệt. Mặc dù việc thực hiện xác nhận thứ hai đơn giản hơn, nhưng điều này làm cho thông báo lỗi về các liên kết bị thiếu trông đẹp hơn, giúp kết quả kiểm tra của bạn dễ đọc hơn.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
Lưu ý rằng "Example"
có thể được thay đổi thành tên hoặc id của liên kết.
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
has_link mong đợi một băm tùy chọn trống nếu bạn không cung cấp bất kỳ tùy chọn nào. Bạn có thể chỉ định bất kỳ thuộc tính nào mà liên kết phải có - chỉ cần đảm bảo bạn vượt qua tất cả các tùy chọn trong MỘT hàm băm.
Hi vọng điêu nay co ich
Tái bút: Đối với các thuộc tính như data-method, bạn phải chuyển tên thuộc tính dưới dạng một chuỗi vì dấu gạch ngang ngắt ký hiệu.
class:
không hợp lệ
Bất cứ khi nào có thể, bạn nên cố gắng sử dụng các trình bao bọc do Capybara cung cấp sẽ hoạt động ổn định hơn trên các trình điều khiển.
Đối với trường hợp cụ thể của disabled
, trình bao bọc đã được giới thiệu trong 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210
Nếu bạn sử dụng nó, bạn sẽ nhận được kết quả hợp lý trên cả RackTest và Poltergeist:
HTML:
<input type="text" id="disabled-false" ></div>
<input type="text" id="disabled-true" disabled></div>
<input type="text" id="disabled-js-true" ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
document.getElementById('disabled-js-true').disabled = true
document.getElementById('disabled-js-false').disabled = false
</script>
Kiểm tra:
!all(:field, 'disabled-false', disabled: false).empty? or raise
all(:field, 'disabled-false', disabled: true ).empty? or raise
all(:field, 'disabled-true', disabled: false).empty? or raise
!all(:field, 'disabled-true', disabled: true ).empty? or raise
all(:field, 'disabled-js-true', disabled: true ).empty? or raise
all(:field, 'disabled-js-false', disabled: false).empty? or raise
Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false', disabled: false).empty? or raise
all(:field, 'disabled-false', disabled: true ).empty? or raise
all(:field, 'disabled-true', disabled: false).empty? or raise
!all(:field, 'disabled-true', disabled: true ).empty? or raise
!all(:field, 'disabled-js-true', disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise
Lưu ý cách sử dụng bộ chọn này thay vì bộ chọn CSS, các bài kiểm tra Javascript sẽ hoạt động mà không có bất kỳ thay đổi nào nếu bạn bắt đầu sử dụng trình điều khiển có khả năng Js.
Tệp thử nghiệm có thể chạy ở đây .
bowsersenior , cảm ơn vì một gợi ý
Một giải pháp đơn giản khác là truy cập thuộc tính HTML mà bạn đang tìm kiếm bằng []
Đây là một ví dụ:
let(:action_items) { page.find('div.action_items') }
it "action items displayed as buttons" do
action_items.all(:css, 'a').each do |ai|
expect(ai[:class]).to match(/btn/)
end
end
Sử dụng cú pháp của Rspec3, tôi đã làm theo cách này:
expect(page).not_to have_selector(:link_or_button, 'Click here')
Theo tài liệu, bạn có thể sử dụng cú pháp của trình truy cập [thuộc tính]:
find('#selector')['class'] => "form-control text optional disabled"
Đối với người bị vô hiệu hóa, bạn cũng có thể làm điều này:
expect(find('#selector').disabled?).to be(true)