Capybara में मूल नोड कैसे प्राप्त करें?


85

मैं कई jQuery प्लगइन्स के साथ काम कर रहा हूं, जो अक्सर आईडी या अन्य पहचान गुणों के बिना DOM तत्व बनाते हैं, और उन्हें Capybara में प्राप्त करने का एकमात्र तरीका (उदाहरण के लिए क्लिक करने के लिए) - अपने पड़ोसी (अपने पूर्वज का एक और बच्चा) को पहले प्राप्त करना है । लेकिन मुझे कहीं भी नहीं मिला, क्या Capybara उदाहरण के लिए ऐसी चीजों का समर्थन करता है:

find('#some_button').parent.fill_in "Name:", :with => name

?


इसके अलावा, यह मेरे लिए बहुत उपयोगी होगा, अगर आप बताएं, क्या Capybara {डिस्प्ले: हिडन} के साथ एलिमेंट्स पर क्लिक करता है, और क्या कुछ स्कोप में एलिमेंट्स को खोजने का कोई तरीका है, जहां डिस्प्ले! = छिपा हुआ है।
11

यह एक अलग प्रश्न है, लेकिन यह उस ड्राइवर पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। वेबब्रैट छिपी हुई चीजों को खुशी से पाएगा, लेकिन सेलेनियम उन वस्तुओं पर क्लिक करने के लिए खुश नहीं है जिन्हें आप नहीं देख सकते हैं।
जमुरा

जवाबों:


111

मैंने वास्तव में जमुरा के उत्तर को मददगार पाया, लेकिन पूर्ण xpath के लिए जाने से मुझे अपने मामले में एक बुरे सपने की अनुभूति हुई, इसलिए मैंने खुशी से Capybara में खोजने की क्षमता का उपयोग किया, जिससे मुझे टॉस और xpath का चयन करने की अनुमति मिली। आपका उदाहरण तब इस तरह दिखेगा:

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name

Capybara 2.0 अद्यतन : find(:xpath,".//..")सबसे अधिक संभावना एक Ambiguous matchत्रुटि में परिणाम होगा । उस स्थिति में, first(:xpath,".//..")इसके बजाय का उपयोग करें ।


उस विचार के लिए धन्यवाद - मैंने ऐसा कभी नहीं सोचा होगा! मैं एक td तत्व के लिए el.parent कर रहा था जिसे मैंने पाया (: css), लेकिन किसी कारण से मुझे समझ में नहीं आया, el.parent # <Capybara :: Document> लौटा रहा था। दूसरी ओर el.find (: xpath, ".// ..") रिटर्न # <Capybara :: तत्व टैग = "tr">, जो मुझे चाहिए था।
टायलर रिक 19

एक निश्चित माता-पिता नोड को पुन: प्राप्त करने का एक और तरीका xpath के पूर्वज-या-स्व चयनकर्ता के साथ है। इसे बाहर की जाँच करें stackoverflow.com/questions/1362466/…
vrish88

25
आपको .//..माता-पिता को खोजने की जरूरत नहीं है - बस ..पर्याप्त है, और यह कभी भी अस्पष्ट नहीं है।
ईमोन नेरबोन

Ty! मुझे पता है कि यह टिप्पणी पार्टी के लिए थोड़ी देर की है, लेकिन मैंने एडिट को पढ़ने के बाद इसे संक्षिप्त किया, और ईमॉन की टिप्पणी: el.first (: xpath, '..')
aschyiel

39

कैपिबारा और सीएसएस के साथ ऐसा करने का कोई तरीका नहीं है। मैंने इस लक्ष्य को पूरा करने के लिए अतीत में XPath का उपयोग किया है, जो कि मूल तत्व प्राप्त करने का एक तरीका है और Capybara द्वारा समर्थित है।]

find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name

2
जब मैं एक समान xpath ढूंढता हूं, तो मुझे एक नोकोगिरी त्रुटि मिलती है जो कहती है कि अभिव्यक्ति अमान्य है। मैंने अभिव्यक्ति को ठीक करने के लिए खुले वर्ग ब्रेकेट में तारांकन चिह्न जोड़ा:find(:xpath, '//*[@id="some_button"]/..')
एंड्रयू फ़र्क

35

मुझे निम्नलिखित मिला जो काम करता है:

find(:xpath, '..')

इसको सपोर्ट करने के लिए Capybara को अपडेट किया गया है।

https://github.com/jnicklas/capybara/pull/505


1
ऐसा लगता है कि आप यहां पिछले उत्तर को पूरा कर रहे हैं / पूरा कर रहे हैं ("यह" क्या "काम नहीं कर रहा था?")। यह बेहतर होगा अगर यह एक पूर्ण और स्वतंत्र जवाब हो। इसलिए मैं आपको इसे संपादित करने की सलाह देता हूं। ;-)
हेलनोव

पुष्टि कर सकते हैं। नवीनतम Capybara 2.14.4 के साथ, यह मूल नोड प्राप्त करने का उचित तरीका है।
fny

10

यदि आप यह जानने की कोशिश कर रहे हैं कि किसी भी माता-पिता ( पूर्वज के रूप में ) नोड को खोजने की कोशिश कर रहे हैं (जैसा कि @Pral लिंडेलुफ के उत्तर पर @ vrish88 की टिप्पणी में बताया गया है):

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')

5

यह उत्तर यह दर्शाता है कि एक भाई तत्व में हेरफेर कैसे किया जाता है, जो कि मेरा मानना ​​है कि मूल प्रश्न से संबंधित है

आपका प्रश्न परिकल्पना एक मामूली ट्वीक के साथ काम करता है। यदि गतिशील रूप से उत्पन्न फ़ील्ड ऐसा दिखता है और इसमें कोई आईडी नहीं है:

<div>
  <input></input>
  <button>Test</button>
</div>

आपकी क्वेरी तब होगी:

find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')

यदि गतिशील रूप से उत्पन्न इनपुट एक आईडी तत्व के साथ जुड़ा हुआ है (इन के साथ सावधान रहें हालांकि कोणीय में, वे तत्वों को जोड़ने और हटाने के आधार पर बदलने के लिए अभ्यस्त हैं) यह कुछ इस तरह होगा:

find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')

उम्मीद है की वो मदद करदे।


4

मैं मूल तत्व को इस मूल तत्व के भीतर पहले पाठ का उपयोग करके एक अलग दृष्टिकोण का उपयोग कर रहा हूं:

find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name

हो सकता है कि यह एक उपयोगी स्थिति में उपयोगी हो।


1
यह एक बेहतरीन विकल्प है। पृष्ठ के एक हिस्से में ui कार्रवाई करना जिसमें कुछ विशेष पाठ शामिल हैं, मेरे लिए एक सामान्य उपयोग-मामला है।
क्लेमेंसप

2

मुझे एक पूर्वज को css वर्ग के साथ खोजने की आवश्यकता थी, हालांकि यह अनिश्चित था कि अगर यह लक्ष्य पूर्वज में एक या एक से अधिक css कक्षाएं मौजूद थीं, तो मुझे निर्धारक xpath क्वेरी बनाने का कोई तरीका नहीं दिखाई दिया। मैंने इसके बजाय यह काम किया:

def find_ancestor_with_class(field, cssClass)
  ancestor = field
  loop do
    ancestor = ancestor.find(:xpath, '..')
    break if ancestor.nil?

    break if ancestor.has_css? cssClass
  end

  ancestor
end

चेतावनी: इस संयम का उपयोग करें, यह आपको परीक्षणों में बहुत समय लग सकता है इसलिए सुनिश्चित करें कि पूर्वज बस कुछ ही दूर है।


स्पीडअप: अपने दूसरे ब्रेक को बदलें break if ancestor[:class].split(" ").include?(css_class)
hakunin

@ ठाकुनिन मैं उत्सुक हूं कि आप कितना स्पीडअप देख रहे हैं? महत्वपूर्ण?
क्रॉस

अब परीक्षण नहीं कर सकते, लेकिन has_css को एक सेकंड लग रहा था, जबकि कक्षा से मिलान तत्काल लग रहा था।
हॉकुनिन

Capybara में अब एक ancestor(selector)मेथड बनाया गया है। देखें github.com/teamcapybara/capybara/commit/…
Tyler Rick

-5

यह रहा

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent

वहाँ एक मूल विधि मौजूद है;)


5
यह केवल मेरे लिए शीर्ष-स्तरीय दस्तावेज़ लौटाता है। सुनिश्चित नहीं है कि यह ड्राइवर का मुद्दा है या क्या।
नेरमाडस्टर

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