capybara एक तत्व के गुण जोर देते हैं


87

मैं स्वीकृति परीक्षण के लिए RSpec2 और Capybara का उपयोग कर रहा हूं।

मैं यह दावा करना चाहता हूं कि कैपिबारा में लिंक अक्षम है या नहीं। मैं यह कैसे कर सकता हूँ?

जवाबों:


91

आप लिंक को कैसे अक्षम कर रहे हैं? क्या यह एक वर्ग है जिसे आप जोड़ रहे हैं? एक विशेषता?

# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")

# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")

# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible

वास्तविक xpath चयनकर्ता गलत हो सकते हैं। मैं अक्सर xpath का उपयोग नहीं करता!


धन्यवाद @idlefingers, मैं xpath का उपयोग करके भी दावा करना चाहता हूं। ऐसा मैं किस प्रकार करूं?
क्रिस्ना

मैंने अपना उत्तर अपडेट कर दिया है। यदि xpath चयनकर्ता गलत हैं, तो आपको कुछ गोल करना होगा या एक नया प्रश्न खोलना होगा।
आइडलफिंगर

ध्यान दें कि यह देखने के परीक्षण के लिए काम नहीं करेगा, क्योंकि विचारों के साथ काम करने के लिए capbbara नहीं बनाया गया है। (वेब्रैट है।)
पीटर

145

एक और सरल उपाय यह है कि आप जिस HTML विशेषता की तलाश कर रहे हैं, उस तक पहुँचने के लिए []:

find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"

find('a#my_element')['href']
# => "http://example.com

# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""

ध्यान दें कि Capybaraस्वचालित रूप से अतुल्यकालिक अनुरोधों को पूरा करने के लिए इंतजार करने की कोशिश करेंगे, लेकिन यह कुछ मामलों में काम नहीं कर सकता है:

यहां एक समाधान है यदि आप उन तत्वों पर जोर दे रहे हैं जो अतुल्यकालिक रूप से अपडेट किए जाते हैं:


4
वाए उपयोगी समाधान। धन्यवाद!
अलेक्जेंडर कुजनेत्सोव

मुझे सीएसएस स्थान के साथ एक स्ट्रिंग मिली है, जैसे। find('a#my_element[href]'), क्या इस विशेषता के मूल्य को प्राप्त करना संभव होगा? भावों के साथ प्रयास find('a#my_element[href]').valueकरने पर भी काम नहीं लगता है :(
विकल

@ मिकेल कोशिश करें find('a#my_element[href]').textया find('a#my_element[href]').native। मुझे बताएं कि क्या उनमें से कोई भी आपको अपेक्षित परिणाम देता है।
बोवर्सनियर

1
मुझे पता है कि ये टिप्पणियां वास्तव में पुरानी हैं, लेकिन इसे इस तरह से इस्तेमाल किया गया है: page.find ('# my_element') ['href = "<href_value>"'] और इसने इलाज किया
डोनो

यदि आप एक एसिंक्रोनस परिवर्तन के बारे में दावा करना चाहते हैं तो यह क्वेरी के सही होने का इंतजार नहीं करेगा।
sj26

4

सही xpath का पता लगाना थोड़ा गड़बड़ था, यहाँ सही है,
capybara का उपयोग 0.4.1.1

# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>  

page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")

यदि आपके पास केवल एक वर्ग के बिना लिंक है, तो उपयोग करें

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')

कुछ इस तरह से काम नहीं करेगा:

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")

वर्ग के विकल्प को नजरअंदाज कर दिया जाएगा।


4

मैं उपयोग करने की सलाह देता हूं have_linkऔर find_link(name)[:disabled]दो अलग-अलग सिद्धांतों में। जबकि दूसरा दावा करना अकेले सरल है, यह गायब लिंक के बारे में त्रुटि संदेश देता है जो अच्छे दिखते हैं, जिससे आपके परीक्षा परिणाम पढ़ने में आसान हो जाते हैं।

expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false

ध्यान दें कि "Example"लिंक के नाम या आईडी को बदला जा सकता है।


1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

has_link को विकल्पों में से एक हैश की उम्मीद है जो खाली है यदि आप कोई भी प्रदान नहीं करते हैं। आप किसी भी विशेषता को निर्दिष्ट कर सकते हैं जो लिंक में होनी चाहिए - बस यह सुनिश्चित करें कि आप एक हैश में सभी विकल्प पास करते हैं।

उम्मीद है की यह मदद करेगा

पुनश्च: डेटा-विधि जैसी विशेषताओं के लिए आपको एक स्ट्रिंग के रूप में विशेषता नाम को पास करना होगा क्योंकि हाइफ़न प्रतीक को तोड़ता है।


6
यह कभी काम नहीं किया और Capybara के साथ काम नहीं करता है। मुझे नहीं पता कि 9 लोगों ने इसे क्यों उखाड़ा।
आंद्रेई बोटालोव

यह अब Capybara में काम नहीं करता है। 2. Capybara <2 का उपयोग करने वाले लोग उपरोक्त का उपयोग कर सकते हैं
Tian

@ यह काप्यबारा में काम नहीं करता था <2. मैं आपको इस उत्तर को अस्वीकार करने का सुझाव देता हूं।
आंद्रेई बोटालोव

class:मान्य नहीं है
अमीर रामिनफर

1

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

के विशेष मामले के लिए disabled, 2.1 में एक रैपर पेश किया गया था: https://github.com/jnicklas/capybara/blob/fc56557a5463b944207f2efa401faabb49d9ef/History.md#version-210

यदि आप इसका उपयोग करते हैं, तो आपको रैकटेस्ट और पोल्टरजिस्ट दोनों पर समझदार परिणाम मिलेंगे:

HTML:

<input type="text" id="disabled-false"            ></div>
<input type="text" id="disabled-true"     disabled></div>
<input type="text" id="disabled-js-true"          ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
  document.getElementById('disabled-js-true').disabled = true
  document.getElementById('disabled-js-false').disabled = false
</script>

टेस्ट:

!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
 all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
 all(:field, 'disabled-js-false', disabled: false).empty? or raise

Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
!all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise

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

Runnable परीक्षण फ़ाइल यहाँ


0

Bowsersenior , एक संकेत के लिए धन्यवाद

एक और सरल उपाय यह है कि आप जिस HTML विशेषता की तलाश कर रहे हैं, उस तक पहुँचने के लिए []

यहाँ एक उदाहरण है:

let(:action_items) { page.find('div.action_items') }

it "action items displayed as buttons" do
  action_items.all(:css, 'a').each do |ai|
    expect(ai[:class]).to match(/btn/)
  end
end

0

Rspec3 के सिंटैक्स का उपयोग करके मैंने इसे इस तरह किया:

expect(page).not_to have_selector(:link_or_button, 'Click here')

0

बस आप page.has_css?विधि का उपयोग कर सकते हैं

page.has_css?('.class_name') 

trueयदि तत्व मौजूद है तो यह वापस आ जाएगा ।

सत्यापन के आधार पर कुछ कार्रवाई करें।

page.has_css?('.class_name') do
  #some code
end

0

डॉक्स के अनुसार आप [विशेषता] एक्सेसर सिंटैक्स का उपयोग कर सकते हैं:

find('#selector')['class'] => "form-control text optional disabled"

विकलांगों के लिए, आप यह भी कर सकते हैं:

expect(find('#selector').disabled?).to be(true)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.