2011-07-18 5 views
31

एक दृश्य फ़ाइल में मेरे पास है:रेल 3 में Capybara का उपयोग कर एक ही पाठ के साथ दूसरे लिंक पर क्लिक करने के लिए कैसे?

= link_to 'View', post 
= link_to 'View', comment 

एक युक्ति फ़ाइल (मैं Capybara उपयोग कर रहा हूँ) में:

click_on 'View' 

यह पहली लिंक पर क्लिक करता है, लेकिन मैं उस पर क्लिक करना चाहते हैं दूसरा। मैं यह कैसे कर सकता हूं?

उत्तर

34

शायद कुछ तरीके हैं लेकिन मैं आमतौर पर ऐसा कुछ गुंजाइश करता हूं।

within(".comment") do 
    click_on("View") 
end 

काफी संभवतः/संभवतः विकल्प भी हैं। मैं आमतौर पर, मेरे स्वीकृति ककड़ी से परीक्षण करना तो मेरे चरणों का आम तौर पर की तरह

When I follow "View" within the comment element 

कहाँ मैं एक कदम है कि कदम खुद को एक दायरे वाले कॉल (जो मुझे लगता है कि नवीनतम capybara web_steps में बनाया गया है) करने के लिए within the comment element तब्दील है देखो

+0

दुर्भाग्यवश, मेरे पास कोई सीएसएस-श्रेणी "टिप्पणी" नहीं है। दो लिंक समान हैं। उनके बीच एकमात्र अंतर उनकी स्थिति है। एक दूसरे के बाद चला जाता है। मैं दूसरे लिंक पर क्लिक करना चाहता हूं। –

+4

मैं प्रस्तुत करता हूं कि आपको तब उस लिंक पर एक कक्षा शुरू करनी चाहिए जिसे आप चुनना चाहते हैं या परीक्षण के लिए एक हुक के रूप में एक रैपर तत्व। आप एनएच-चाइल्ड स्यूडोसेलेक्टर (http://www.w3.org/TR/css3-selectors/#nth-child-pseudo) का उपयोग करने में सक्षम हो सकते हैं, लेकिन मैं इसके खिलाफ अनुशंसा करता हूं क्योंकि यह एक भंगुर और ऑर्डर-निर्भर लिंकेज पेश करता है अपने परीक्षण में – karmajunkie

+0

धन्यवाद! मुझे यही चाहिए! मेरे मामले में 'एनएच-चाइल्ड' बहुत अच्छा है! –

51

आप सभी प्रविष्टियों का पता लगाने और एक सरणी के साथ सौदा करने की कोशिश कर सकते:

page.all('a')[1].click 

एक वर्ग है या अपनी खोज गुंजाइश के लिए भीतर उपयोग करने के लिए मदद करेंगे;)

+1

काम करता है यदि आपके पृष्ठ पर केवल दो लिंक हैं :) – installero

7

capybara 2 समाधान के लिए: यदि आप कुछ .comment है

within(".comment") do 
    click_on("View") 
end 

मदद नहीं होता। इतना आसान उपयोग: page.first(:link, "View").click

+2

बिंदु दूसरे लिंक पर क्लिक करना है :) – installero

+0

दूसरा लिंक लेखक चाहता है। – Jwan622

15

"दूसरा" लिंक के बारे में सबसे बुरी बात यह है कि यह तीसरा या पहला या यहां तक ​​कि बीस पांचवां दिन बन सकता है। तो, within ब्लॉक के साथ स्कॉइंग सबसे अच्छा तरीका है। उदाहरण:

within(".comment") do 
    click_on("View") 
end 

लेकिन अगर यह एक within गुंजाइश के साथ लिंक (जो कभी कभी यह वास्तव में है) निर्दिष्ट करने के लिए मुश्किल है, मैं जिस तरह से एक निश्चित पाठ के साथ क्लिक करने के लिए दूसरी कड़ी लगता है:

find(:xpath, "(//a[text()='View'])[2]").click 

capybara के बाद के संस्करणों (2.0.2, उदाहरण के लिए) में दोनों click_on 'दृश्य' और click_link 'दृश्य' एक अस्पष्ट मैच त्रुटि बढ़ा देंगे:

Failure/Error: click_on 'View' 
Capybara::Ambiguous: 
    Ambiguous match, found 2 elements matching link or button "View" 

तो यह तब भी नहीं होगा जब आप पहले लिंक पर क्लिक करना चाहते हैं (या यदि कोई लिंक ठीक होगा, जो मेरा मामला है)।

जहां तक ​​मैं समझता हूं कि लोगों को अधिक विशिष्ट परीक्षण लिखने के लिए मजबूर किया जाता है जहां विशेष लिंक क्लिक किए जाते हैं।

यदि आप गलती से समान पाठ के साथ दो या दो से अधिक लिंक डालते हैं और क्या हो रहा है यह देखने का प्रयास करते हैं तो कोड को डीबग करना मुश्किल हो सकता है। within ब्लॉक के साथ एक लिंक को बदलने और निर्दिष्ट करने की संभावना नहीं है, इस पर भरोसा करना अच्छा होता है।

15

इस प्रकार की समस्याओं को हल करने के कई तरीके हैं।
यह की तरह इस

if(page.find("a")[:href] == "comment") 
    click_on("View") 

या

page.find("a:eq(2)").click 

याद रखें जावास्क्रिप्ट अनुक्रमण 0 जबकि Capybara में साथ शुरू होता है, अनुक्रमण 1 के साथ शुरू होता है। तो दूसरे href के लिए यहां एक: eq (2) का उपयोग करें।

+7

बस ध्यान दें कि "कैपिबरा इंडेक्सिंग" नहीं है, यह सिर्फ सीएसएस चयनकर्ता कैसे काम करते हैं – Benja

2

यदि आपके पास समान कक्षाओं की कई पंक्तियां हैं और आप दूसरी पंक्ति खोजना चाहते हैं तो यह मेरे लिए काम करता है। पिछले एक लेखक उल्लेख की तरह, capybara अनुक्रमण पर 1.

within all(".trip-row")[2] do 
    assert page.has_content?("content") 
end 
1

शुरू होता है, तो आप capybara-ui का उपयोग आप विजेट, या पुन: प्रयोज्य डोम संदर्भ निर्धारित कर सकते हैं, प्रत्येक विजेट के लिए।

# define your widget. in this case, 
# we're defining it in a role 
widget :view_post, ['.post', text: 'View'] 
widget :view_comment, ['.comment', text: 'View'] 

# then click that widget in the test 
role.click :view_post 
role.click :view_comment 
संबंधित मुद्दे