Capybara 2.0 में अपग्रेड करने के बाद आइटम की सूची में पहला लिंक कैसे क्लिक करें?


125

उस मामले में पहला लिंक कैसे क्लिक करें:

<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

और मुझे यह त्रुटि मिली:

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

और बिना withinमुझे यह त्रुटि मिलती है:

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

जवाबों:


176

आप बस उपयोग कर सकते हैं:

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

या

first('.item > a').click

(यदि आपका डिफ़ॉल्ट चयनकर्ता है: css)


आपके प्रश्न में कोड इस तरह काम नहीं करता है:

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

के बराबर है:

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

Capybara कई पाता है .itemतो यह एक अपवाद को जन्म देता है। मैं Capybara 2 के इस व्यवहार को बहुत अच्छा मानता हूं।


4
मैं #first का उपयोग करने के खिलाफ सिफारिश करूंगा, यह किसी तत्व के अस्तित्व में आने का इंतजार नहीं करता है: rubydoc.info/github/jnicklas/capybara/… । यदि जेएस के साथ सामग्री रनटाइम पर बनाई गई थी, तो यह लिंक तैयार होने से पहले अपेक्षा को पूरा करने पर शून्य वापस आ जाएगी।
dgtized

122

निम्नलिखित प्रयास करें:

within ".item" do
  click_link("Agree", :match => :first)
end

सूत्रों का कहना है:


1
गजब का। और यह सरल page.find ('# {css}',: मैच =>: पहला) पर काम करता है। वास्तव में उपयोगी उत्तर के लिए चीयर्स पर क्लिक करें
Dono


4

Xpath तत्व को संबोधित कर सकते हैं। मैं अभी तक इसके साथ बहुत अच्छा नहीं हूँ, लेकिन कुछ ऐसा है//div[@class='active'][1]/a

यह काम कर भी सकता है और नहीं भी, लेकिन बात यह है कि xpath एक सरणी को संबोधित कर सकता है और किसी विशेष को बाहर निकाल सकता है। आपको इससे मेल खाने में सक्षम होना चाहिए।

मेरी एक परियोजना से एक कार्यशील उदाहरण

page.find ("div.panel", पाठ: / प्रस्ताव /) के भीतर
  page.find ('tr', text: / Foo /) के भीतर
    page.should has_xpath ('td [3]', टेक्स्ट: @today)
  समाप्त
समाप्त

2

चूंकि पहले () हमेशा इंतजार नहीं करते, शायद यह उपयोगी है:

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

2

उन समाधानों में से अधिकांश Capybara की शानदार प्रतीक्षा सुविधाओं का उपयोग नहीं करेंगे

इस लिंक से बेहतर पता चलता है:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

खराब:

first(".active").click
यदि पृष्ठ पर अभी तक कोई सक्रिय तत्व नहीं है, तो पहले शून्य वापस आ जाएगा और क्लिक विफल हो जाएगा।

अच्छा:

यदि आप यह सुनिश्चित करना चाहते हैं कि वास्तव में एक है
find(".active").click

यदि आप केवल पहला तत्व चाहते हैं तो
find(".active", match: :first).click
Capybara क्लिक करने का प्रयास करने से पहले तत्व के प्रदर्शित होने की प्रतीक्षा करेगा।

ध्यान दें कि match: :first अधिक भंगुर है, क्योंकि यदि आप नए तत्वों से मेल खाते हैं तो यह चुपचाप एक अलग तत्व पर क्लिक करेगा।


मेरा मानना ​​है कि यह सबसे सटीक उत्तर है।
15

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.