Saya menggunakan RSpec2 dan Capybara untuk pengujian penerimaan.
Saya ingin menegaskan bahwa tautan dinonaktifkan atau tidak di Kapibara. Bagaimana saya bisa melakukan ini?
Jawaban:
Bagaimana Anda menonaktifkan tautan tersebut? Apakah ini kelas yang Anda tambahkan? Atribut?
# 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
Pemilih xpath yang sebenarnya mungkin salah. Saya tidak sering menggunakan xpath!
Solusi sederhana lainnya adalah mengakses atribut HTML yang Anda cari []
:
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']
# => ""
Perhatikan bahwa Capybara
secara otomatis akan mencoba menunggu permintaan asinkron selesai, tetapi mungkin tidak berfungsi dalam beberapa kasus:
Berikut ini satu solusi jika Anda mengalami masalah dengan pernyataan pada elemen yang diperbarui secara asinkron:
find('a#my_element[href]')
, apakah mungkin untuk mengambil nilai atribut ini? Mencoba dengan ekspresi seperti find('a#my_element[href]').value
tetapi sepertinya tidak berhasil :(
find('a#my_element[href]').text
atau find('a#my_element[href]').native
. Beri tahu saya jika salah satu dari mereka memberikan hasil yang Anda harapkan.
Agak berantakan untuk menemukan xpath yang benar, ini yang benar,
menggunakan kapibara 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")
Jika Anda hanya memiliki link tanpa kelas, gunakan
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
Sesuatu seperti ini sayangnya tidak akan berhasil:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
Opsi kelas akan diabaikan.
Saya merekomendasikan penggunaan have_link
danfind_link(name)[:disabled]
dalam dua pernyataan terpisah. Meskipun melakukan pernyataan kedua saja lebih sederhana, ini membuat pesan kesalahan tentang tautan yang hilang terlihat lebih bagus, membuat hasil pengujian Anda lebih mudah dibaca.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
Perhatikan bahwa "Example"
dapat diubah menjadi nama atau id link.
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
has_link mengharapkan hash opsi yang kosong jika Anda tidak menyediakannya. Anda dapat menentukan atribut apa pun yang harus dimiliki tautan - cukup pastikan Anda meneruskan semua opsi dalam SATU hash.
Semoga ini membantu
PS: Untuk atribut seperti metode data Anda harus meneruskan nama atribut sebagai string karena tanda hubung memecah simbol.
class:
tidak valid
Bila memungkinkan, Anda harus mencoba menggunakan pembungkus yang disediakan Capybara yang akan bekerja lebih konsisten di seluruh driver.
Untuk kasus tertentu disabled
, pembungkus diperkenalkan di 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210
Jika Anda menggunakannya, Anda akan mendapatkan hasil yang masuk akal di RackTest dan 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>
Tes:
!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
Perhatikan bagaimana dengan menggunakan ini alih-alih pemilih CSS, tes Javascript akan bekerja tanpa perubahan apa pun jika Anda mulai menggunakan driver berkemampuan Js.
File pengujian yang dapat dijalankan di sini .
bowsersenior , terima kasih atas petunjuknya
Solusi sederhana lainnya adalah mengakses atribut HTML yang Anda cari dengan []
Berikut ini contohnya:
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
Menggunakan sintaks Rspec3 saya melakukannya dengan cara ini:
expect(page).not_to have_selector(:link_or_button, 'Click here')
Menurut dokumen, Anda dapat menggunakan sintaks aksesor [atribut]:
find('#selector')['class'] => "form-control text optional disabled"
Untuk penyandang cacat, Anda juga bisa melakukan ini:
expect(find('#selector').disabled?).to be(true)