ककड़ी के साथ एक पुष्टिकरण संवाद का परीक्षण कैसे करें?


86

मैं रूबी ऑन रेल्स विद ककड़ी और कैपीबारा का उपयोग कर रहा हूं।

मैं एक साधारण पुष्टिकरण कमांड ("क्या आप निश्चित हैं?") परीक्षण के बारे में कैसे जाएंगे?

इसके अलावा, मुझे इस मुद्दे पर और दस्तावेज कहां मिल सकते हैं?


यदि आप Capybara-webkit का उपयोग कर रहे हैं, तो आपको वहां अपना उत्तर मिलेगा: stackoverflow.com/questions/6930927/…
Adrien

जवाबों:


62

ऐसा लगता है कि Capybara में ऐसा करने का कोई तरीका नहीं है, दुर्भाग्य से। लेकिन अगर आप सेलेनियम ड्राइवर (और शायद जावास्क्रिप्ट का समर्थन करने वाले अन्य ड्राइवर) के साथ अपने परीक्षण चला रहे हैं, तो आप इसे हैक कर सकते हैं। पुष्टि डायलॉग लाने वाली कार्रवाई करने से ठीक पहले, confirmहमेशा सही लौटने की विधि को ओवरराइड करें । इस तरह संवाद कभी प्रदर्शित नहीं होगा, और आपके परीक्षण जारी रह सकते हैं जैसे कि उपयोगकर्ता ने ओके बटन दबाया था। यदि आप रिवर्स का अनुकरण करना चाहते हैं, तो इसे गलत तरीके से बदलने के लिए।

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')

यह फ़ायरफ़ॉक्स 4 में अब और काम नहीं करता है ... @ derek-ekins समाधान नीचे से, Google मुझे जो बताता है, वह अधिक अग्रेषित-संगत लगता है, हालांकि मैं अभी पुष्टि नहीं कर सकता (मैं Capybara पर अटक गया हूं) 0.3.9)।
कार्पेलियम

1
प्रयोग करने के लिए नीचे दिए गए जवाब देखें "page.driver.browser.switch_to ..."
Thorbjorn Hermansen

134

सेलेनियम ड्राइवर अब इसका समर्थन करता है

Capybara से आप इसे इस तरह एक्सेस करेंगे:

page.driver.browser.switch_to.alert.accept

या

page.driver.browser.switch_to.alert.dismiss

या

 page.driver.browser.switch_to.alert.text

2
इसके बाद किसी और के लिए - कृपया ध्यान दें कि डेरेक का जवाब वास्तव में काम करता है जहां मैंने पाया कि आधिकारिक सेलेनियम प्रलेखन में कोड (ककड़ी / सेलेनियम) नहीं था। page.driver.browserडेरेक के उत्तर में उपस्थिति पर ध्यान दें
पीटर निक्स

पीटर - यहाँ कोड विशेष रूप से काइपबारा का उपयोग करने के लिए बनाया गया है, जबकि डॉक्स में कोड तब होता है जब आप सीधे सेलेनियम-वेबड्राइवर का उपयोग कर रहे होते हैं - मैंने उस उदाहरण को लिखा था और इसलिए मुझे आशा है कि यह काम करेगा!
डेरेक एकिन्स

आह। हां, अच्छी बात है और मेरे द्वारा पूरी तरह से याद किया गया। उस मामले में दोनों उदाहरणों के लिए धन्यवाद।
पीटर निक्से

39

मैंने इन दो वेब चरणों को लागू किया है /features/step_definitions/web_steps.rb:

When /^I confirm popup$/ do
  page.driver.browser.switch_to.alert.accept    
end

When /^I dismiss popup$/ do
  page.driver.browser.switch_to.alert.dismiss
end

8

यदि आप विशेष रूप से प्रदर्शित किए जा रहे संदेश का परीक्षण करना चाहते हैं, तो ऐसा करने के लिए एक विशेष रूप से हैक करने का तरीका है। मैं इसे सुंदर कोड के रूप में समर्थन नहीं करता, लेकिन इससे काम हो जाता है। अगर आपको jQuery नहीं चाहिए तो आपको http://plugins.jquery.com/node/1386/release लोड करना होगा , या इसे कुकीज में बदलना होगा।

इस तरह की कहानी का उपयोग करें:

Given I am on the menu page for the current booking
And a confirmation box saying "The menu is £3.50 over budget. Click Ok to confirm anyway, or Cancel if you want to make changes." should pop up
And I want to click "Ok"
When I press "Confirm menu"
Then the confirmation box should have been displayed

और ये कदम

Given /^a confirmation box saying "([^"]*)" should pop up$/ do |message|
  @expected_message = message
end

Given /^I want to click "([^"]*)"$/ do |option|
  retval = (option == "Ok") ? "true" : "false"

  page.evaluate_script("window.confirm = function (msg) {
    $.cookie('confirm_message', msg)
    return #{retval}
  }")
end

Then /^the confirmation box should have been displayed$/ do
  page.evaluate_script("$.cookie('confirm_message')").should_not be_nil
  page.evaluate_script("$.cookie('confirm_message')").should eq(@expected_message)
  page.evaluate_script("$.cookie('confirm_message', null)")
end

2
शांत समाधान! मैंने इसे थोड़ा इधर-उधर कर दिया, जो मेरे लिए अधिक स्वाभाविक लगता है: gist.github.com/727614
Mat Schaffer

और यहाँ उस कोड का एक और संस्करण है जो अलर्ट और पुष्टिकरण दोनों का समर्थन करता है, gist.github.com/919116
मैथ्यू

3

कैपिबारा के वर्तमान रिलीज के लिए इसे अपडेट करना। अधिकांश Capybara ड्राइवर आज modal API का समर्थन करते हैं। एक पुष्टि मोडल को स्वीकार करने के लिए आप क्या करेंगे

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

इसे ककड़ी में कुछ इस तरह से इस्तेमाल किया जा सकता है

When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

जो नामित बटन पर क्लिक करेगा और फिर टेक्स्ट मिलान संदेश के साथ एक पुष्टिकरण बॉक्स स्वीकार करेगा



2
Scenario: Illustrate an example has dialog confirm with text
    #     
    When I confirm the browser dialog with tile "Are you sure?"
    #
=====================================================================
my step definition here:

And(/^I confirm the browser dialog with title "([^"]*)"$/) do |title|
  if page.driver.class == Capybara::Selenium::Driver
    page.driver.browser.switch_to.alert.text.should eq(title)
    page.driver.browser.switch_to.alert.accept
  elsif page.driver.class == Capybara::Webkit::Driver
    sleep 1 # prevent test from failing by waiting for popup
    page.driver.browser.confirm_messages.should eq(title)
    page.driver.browser.accept_js_confirms
  else
   raise "Unsupported driver"
 end
end


0

इस जिस्ट में किसी भी Capybara ड्राइवर के साथ Rails 2 और 3 में JS पुष्टि संवाद का परीक्षण करने के चरण हैं।

यह पिछले उत्तर का एक अनुकूलन है, लेकिन jQuery कुकी प्लगइन की आवश्यकता नहीं है।


0

उपर्युक्त उत्तरों को बिना किसी भाग्य के प्रयास किया। अंत में यह मेरे लिए काम किया:

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