capybara menegaskan atribut suatu elemen

87

Saya menggunakan RSpec2 dan Capybara untuk pengujian penerimaan.

Saya ingin menegaskan bahwa tautan dinonaktifkan atau tidak di Kapibara. Bagaimana saya bisa melakukan ini?

kriysna
sumber

Jawaban:

91

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!

orang yang menganggur
sumber
Terima kasih @idlefingers, saya ingin menegaskan menggunakan xpath juga. Bagaimana saya bisa melakukannya?
kriysna
Saya telah memperbarui jawaban saya. Jika pemilih xpath salah, Anda harus melakukan googling atau membuka pertanyaan baru.
penganggur
Perhatikan bahwa ini tidak akan berfungsi untuk pengujian tampilan, karena kapibara tidak dibuat untuk berfungsi dengan tampilan. (Webrat adalah.)
Peter Ehrlich
145

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

bowsersenior
sumber
4
Solusi berguna Vrey. Terima kasih!
Alexander Kuznetsov
Saya punya string dengan lokasi css, mis. find('a#my_element[href]'), apakah mungkin untuk mengambil nilai atribut ini? Mencoba dengan ekspresi seperti find('a#my_element[href]').valuetetapi sepertinya tidak berhasil :(
mickael
@mickael Coba find('a#my_element[href]').textatau find('a#my_element[href]').native. Beri tahu saya jika salah satu dari mereka memberikan hasil yang Anda harapkan.
bowsersenior
1
Saya menyadari bahwa komentar ini benar-benar lama, tetapi menggunakannya seperti ini: page.find ('# my_element') ['href = "<href_value>"'] dan itu berhasil
Dono
Ini tidak akan menunggu kueri menjadi benar jika Anda ingin membuat pernyataan tentang perubahan asinkron.
sj26
4

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.

Clint
sumber
4

Saya merekomendasikan penggunaan have_linkdanfind_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.

Nick McCurdy
sumber
1
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.

kaikuchn
sumber
6
Itu tidak pernah berhasil dan tidak bekerja dengan Kapibara. Saya tidak tahu mengapa 9 orang memberi suara positif untuk ini.
Andrei Botalov
Ini tidak lagi berfungsi di Kapibara 2. Orang-orang yang menggunakan Kapibara <2 dapat menggunakan yang di atas
Tian
@Tian itu tidak berhasil di Capybara <2. Saya sarankan Anda untuk merendahkan jawaban ini.
Andrei Botalov
class:tidak valid
Amir Raminfar
1

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 .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
0

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
18 Agustus
sumber
0

Menggunakan sintaks Rspec3 saya melakukannya dengan cara ini:

expect(page).not_to have_selector(:link_or_button, 'Click here')
Camilo Sad
sumber
0

Cukup Anda bisa menggunakan page.has_css?metode

page.has_css?('.class_name') 

ini akan kembali truejika ada elemen.

Lakukan beberapa tindakan berdasarkan validasi.

page.has_css?('.class_name') do
  #some code
end
Aravin
sumber
0

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)
pixelearth
sumber