Capybara 2.0'a yükselttikten sonra öğeler listesindeki ilk bağlantıya nasıl tıklanır?


125

Bu durumda ilk bağlantı nasıl tıklanır:

<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

ve şu hatayı alıyorum:

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

Ve withinben olmadan bu hatayı alıyorum:

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

Yanıtlar:


176

Sadece kullanabilirsiniz:

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

veya

first('.item > a').click

(varsayılan seçiciniz: css ise)


Sorunuzdaki kod şu şekilde çalışmıyor:

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

eşdeğerdir:

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

Capybara birkaç tane bulur, .itembu yüzden bir istisna yaratır. Capybara 2'nin bu davranışını çok iyi görüyorum.


4
# İlk olarak kullanılmamasını öneririm, bir öğenin var olmasını beklemez : rubydoc.info/github/jnicklas/capybara/… . İçerik çalışma zamanında JS ile oluşturulmuşsa, bağlantı oluşturulmadan önce beklentiyi çalıştırırsa ilk olarak nil döndürür.
2016


24

Bu ifade aynı zamanda işe yarar:

within first(".item") do
  click_link "Agree"
end

Benim için çalıştı, teşekkürler. Capybara 2.4.1 ve poltergeist.
Mauricio Moraes

4

Xpath, elemanı adresleyebilir. Henüz onunla pek iyi değilim, ama şöyle bir şey//div[@class='active'][1]/a

Bu işe yarayabilir veya işe yaramayabilir, ancak önemli olan, xpath'in bir dizi eşleşmeyi ele alabilmesi ve belirli birini çıkarabilmesidir. Bununla eşleşebilmelisin.

Projelerimden birinden çalışan bir örnek:

page.find içinde ("div.panel", text: / Proposals /) do
  page.find ('tr', text: / Foo /) do
    page.should olmalıdır_xpath ('td [3]', text: @today)
  son
son

2

First () her zaman beklemediğinden, belki bu yararlıdır:

expect(page).to have_css("selector")                               
first("selector").click

2

bu çözümlerin çoğu Capybara'nın parlak bekleme özelliklerini kullanmayacak

bu bağlantının önerdiği gibi daha iyi yapın :
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

Kötü:

first(".active").click
Sayfada henüz bir .active öğesi yoksa, önce sıfır döndürür ve tıklama başarısız olur.

İyi:

Tam olarak bir tane olduğundan emin olmak istiyorsan
find(".active").click

Sadece ilk öğeyi istiyorsanız,
find(".active", match: :first).click
Capybara, tıklamayı denemeden önce öğenin görünmesini bekleyecektir.

Bunun match: :firstdaha kırılgan olduğunu unutmayın , çünkü eşleşen yeni öğeler eklerseniz farklı bir öğeye sessizce tıklayacaktır.


Bunun en doğru cevap olduğuna inanıyorum.
katericata

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.