मैं कैसे जांच सकता हूं कि कैपिबारा का उपयोग करके एक फॉर्म फ़ील्ड सही ढंग से प्रीफ़िल्ड है?


145

मेरे पास एक उचित लेबल वाला फ़ील्ड है जिसे मैं बिना किसी समस्या के कैपिबारा के साथ भर सकता हूं:

fill_in 'Your name', with: 'John'

मैं इसे भरने से पहले इसके मूल्य की जांच करना चाहता हूं और इसका पता नहीं लगा सकता।

यदि मैं fill_inनिम्नलिखित पंक्ति के बाद जोड़ता हूं :

find_field('Your name').should have_content('John')

यह परीक्षण विफल हो जाता है, हालांकि काम करने से पहले भरने के रूप में मैं पृष्ठ को बचाने के द्वारा सत्यापित किया है।

मैं क्या खो रहा हूँ?

जवाबों:


179

आप xpath क्वेरी का उपयोग यह जांचने के लिए कर सकते हैं कि inputकोई विशेष मान वाला कोई तत्व है (उदाहरण के लिए 'जॉन'):

expect(page).to have_xpath("//input[@value='John']")

अधिक जानकारी के लिए http://www.w3schools.com/xpath/xpath_syntax.asp देखें ।

शायद के लिए एक सुंदर तरीका:

expect(find_field('Your name').value).to eq 'John'

संपादित करें: आजकल मैं शायद has_selector का उपयोग करता हूं

expect(page).to have_selector("input[value='John']")

यदि आप पृष्ठ ऑब्जेक्ट पैटर्न का उपयोग कर रहे हैं (आपको होना चाहिए!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"

आह, मुझे .valueथोड़ी याद आ रही थी । धन्यवाद!
मार्क-आंद्रे लाफ्यून

मैं एक ही समस्या हो रही थी, लेकिन एक फार्म क्षेत्र के बजाय एक div के साथ। किसी और को एक ही समस्या होने के लिए, find_by_id () का उपयोग करें। find_field () के बजाय पाठ। मान। मुझे यह पता लगाने में उम्र लग गई कि मूल्य केवल फॉर्म फील्ड पर काम करता है ...
जॉन वाई

8
बाद के तरीके के साथ समस्या यह है कि यह कैपिबारा के मतदान चक्र का उपयोग नहीं करता है और इसलिए यदि क्षेत्र लंबे समय तक चलने वाले जेएस कोड द्वारा सेट किया गया है तो यह तुरंत विफल हो जाएगा। जब तक आप इसे वैधानिक रूप से उत्पन्न नहीं कर रहे हैं, तब तक पहले तरीके को प्राथमिकता दी जाएगी।
fxxp

1
मुझे लगता है कि @fqxp के पास बेहतर उत्तर है जो RSpec मिलान और नई अपेक्षा सिंटैक्स का उपयोग करता है। दस्तावेज़ीकरण में मैं जो देखता हूं, find_fieldऔर अन्य Node::Findersका उपयोग नोड्स खोजने और अपेक्षा के बजाय उन पर कार्रवाई करने के लिए किया जाता है। बेशक यह एक नियम नहीं है, लेकिन कुछ सरल के लिए क्योंकि यह इनबिल्ट समाधान के साथ जाना एक बेहतर विचार है। बस केह रहा हू!
Agent47DarkSoul

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

309

एक और सुंदर समाधान होगा:

page.should have_field('Your name', with: 'John')

या

expect(page).to have_field('Your name', with: 'John')

क्रमशः।

संदर्भ भी देखें ।

नोट : अक्षम इनपुट के लिए, आपको विकल्प जोड़ना होगा disabled: true


23
चयनित उत्तर से बहुत बेहतर!
Agent47DarkSoul

3
मैं अभी भी चयनित जवाब पसंद करूंगा क्योंकि त्रुटि संदेश आपको अपेक्षित और वास्तविक तार दिखाता है। यह कुछ "त्रुटि" वापस करने के लिए "अपेक्षित फ़ील्ड" मेरा क्षेत्र "देता है। लेकिन यह निश्चित रूप से बेहतर पढ़ता है और पेज मिलान एपीआई को बेहतर तरीके से अनुसरण करता है। चारों ओर अपवित्र !!!
माररोनक्रूज

1
जहां तक ​​मैं बता सकता हूं, यह वास्तव में क्षेत्र के मूल्य की पुष्टि नहीं करता है, केवल मूल्य की परवाह किए बिना क्षेत्र की उपस्थिति। मैं यह अनुमान लगा रहा हूं कि डॉक्स का कहना है कि यह मान के आधार पर फ़िल्टर होना चाहिए।
निक

1
withनिश्चित रूप से पासिंग केवल सही है अगर मूल्य मेरे लिए मेल खाता है, जो अपेक्षित परिणाम है।
बेन सौफले

4
हो सकता है कि उत्तर को पहले लिखे जाने के बाद से त्रुटि संदेश में सुधार हुआ हो, लेकिन मैं अब expected […] but there were no matches. Also found "", which matched the selector but not all filters..एक खाली क्षेत्र पर पहुंचता हूं जो बहुत अच्छे त्रुटि संदेश के बहुत करीब आता है।
पटरू

2

यदि आप विशेष रूप से प्लेसहोल्डर के लिए परीक्षण करना चाहते हैं, तो उपयोग करें:

page.should have_field("some_field_name", placeholder: "Some Placeholder")

या:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

यदि आप उपयोगकर्ता द्वारा दर्ज मूल्य का परीक्षण करना चाहते हैं:

page.should have_field("some_field_name", with: "Some Entered Value")

0

मैं सोच रहा था कि कुछ अलग कैसे किया जाए: मैं यह परीक्षण करना चाहता था कि क्या मैदान का कोई मूल्य है (जबकि मैच होने तक मैचर को फिर से परखने की कैपिबारा की क्षमता का उपयोग करते हुए )। यह पता चला है कि ऐसा करने के लिए "फ़िल्टर ब्लॉक" का उपयोग करना संभव है:

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.