Bagaimana cara mengklik tautan pertama dalam daftar item setelah meningkatkan ke Capybara 2.0?

125

Cara mengeklik tautan pertama dalam kasus itu:

<div class="item">
  <a href="/agree/">Agree</a>
</div>
<div class="item">
  <a href="/agree/">Agree</a>
</div>
within ".item" do
  first(:link, "Agree").click
end

dan saya mendapatkan kesalahan ini:

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

Dan tanpa withinsaya mendapatkan kesalahan ini:

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass
tomekfranek
sumber

Jawaban:

176

Anda bisa menggunakan:

first('.item').click_link('Agree')

atau

first('.item > a').click

(jika pemilih default Anda adalah: css)


Kode dalam pertanyaan Anda tidak berfungsi sebagai:

within ".item" do
  first(:link, "Agree").click
end

setara dengan:

find('.item').first(:link, "Agree").click

Capybara menemukan beberapa .item's sehingga menimbulkan pengecualian. Saya menganggap perilaku Capybara 2 ini sangat baik.

Andrei Botalov
sumber
4
Saya akan merekomendasikan agar tidak menggunakan #pertama, itu tidak menunggu elemen ada: rubydoc.info/github/jnicklas/capybara/… . Jika konten dibuat saat runtime dengan JS, pertama akan mengembalikan nol jika menjalankan harapan sebelum tautan dibuat.
dgtized
24

Frasa ini juga berfungsi:

within first(".item") do
  click_link "Agree"
end
Elle Mundy
sumber
Bekerja untuk saya, terima kasih. Capybara 2.4.1 dan poltergeist.
Mauricio Moraes
4

Xpath dapat mengatasi elemen tersebut. Saya belum terlalu bagus dengan itu, tetapi sesuatu seperti//div[@class='active'][1]/a

Itu mungkin atau mungkin tidak berfungsi, tetapi intinya adalah bahwa xpath dapat menangani array yang cocok dan mengeluarkan yang tertentu. Anda harus bisa mencocokkan dengan ini.

Contoh contoh kerja dari salah satu proyek saya:

dalam page.find ("div.panel", teks: / Proposal /) lakukan
  dalam page.find ('tr', teks: / Foo /) lakukan
    page.harus have_xpath ('td [3]', teks: @today)
  akhir
akhir
DGM
sumber
2

Karena first () tidak selalu menunggu, mungkin ini berguna:

expect(page).to have_css("selector")                               
first("selector").click
nroose
sumber
2

sebagian besar dari solusi tersebut tidak akan menggunakan fitur menunggu brilian Capybara

lebih baik lakukan seperti yang disarankan tautan ini: https://thoughtbot.com/blog/write-r reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-
element

Buruk:

first(".active").click
Jika belum ada elemen .active pada halaman, pertama akan mengembalikan nol dan klik akan gagal.

Baik:

Jika Anda ingin memastikan ada yang tepat
find(".active").click

Jika Anda hanya ingin elemen pertama,
find(".active", match: :first).click
Capybara akan menunggu elemen muncul sebelum mencoba mengklik.

Catatan yang match: :firstlebih rapuh, karena itu akan secara diam-diam mengklik elemen yang berbeda jika Anda memperkenalkan elemen baru yang cocok.

Salomanuel
sumber
Saya percaya ini adalah jawaban yang paling akurat.
katericata
-2

Sederhana yang dapat Anda gunakan:

$('.item').find('a').first().click();
Vlog IT
sumber
2
Contoh ini tidak relevan dengan capybara
keoghpe
2
Bukankah itu jQuery?
emptywalls