จะทดสอบกล่องโต้ตอบยืนยันกับแตงกวาได้อย่างไร?


86

ฉันใช้ Ruby on Rails กับ Cucumber และ Capybara

ฉันจะทดสอบคำสั่งยืนยันอย่างง่ายได้อย่างไร ("แน่ใจหรือ")

นอกจากนี้ฉันจะหาเอกสารเพิ่มเติมเกี่ยวกับปัญหานี้ได้ที่ไหน


หากคุณใช้ Capybara-webkit คุณจะพบคำตอบที่นั่น: stackoverflow.com/questions/6930927/…
Adrien

คำตอบ:


62

ดูเหมือนว่าจะไม่มีทางทำได้ใน Capybara น่าเสียดาย แต่ถ้าคุณกำลังทำการทดสอบด้วยไดรเวอร์ Selenium (และอาจเป็นไดรเวอร์อื่น ๆ ที่รองรับ JavaScript) คุณสามารถแฮ็คได้ ก่อนที่จะดำเนินการที่จะเปิดกล่องโต้ตอบยืนยันให้แทนที่confirmเมธอดเพื่อคืนค่าจริงเสมอ ด้วยวิธีนี้กล่องโต้ตอบจะไม่ปรากฏขึ้นและการทดสอบของคุณจะดำเนินต่อไปได้ราวกับว่าผู้ใช้กดปุ่มตกลง หากคุณต้องการจำลองการย้อนกลับเพียงแค่เปลี่ยนเป็นคืนค่าเท็จ

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

ดูเหมือนจะใช้ไม่ได้อีกต่อไปใน Firefox 4 ... @ derek-ekins โซลูชันด้านล่างจากสิ่งที่ Google บอกฉันดูเหมือนว่าจะเข้ากันได้กับการส่งต่อมากขึ้นแม้ว่าฉันจะยังไม่สามารถยืนยันได้ (ฉันติดอยู่กับ Capybara 0.3.9)
carpeliam

1
ดูคำตอบด้านล่างสำหรับการใช้ "page.driver.browser.switch_to ... "
Thorbjørn 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
สำหรับใครก็ตามที่ติดตามสิ่งนี้ - โปรดทราบว่าคำตอบของ Derek ใช้งานได้จริงเมื่อพบว่ารหัสในเอกสาร Selenium อย่างเป็นทางการไม่ได้ (แตงกวา / ซีลีเนียม) สังเกตการปรากฏตัวของpage.driver.browserคำตอบของ Derek
Peter Nixey

Peter - โค้ดที่นี่ได้รับการออกแบบมาโดยเฉพาะสำหรับการใช้ capybara ในขณะที่โค้ดในเอกสารมีไว้สำหรับเมื่อคุณใช้ selenium-webdriver โดยตรง - ฉันเขียนตัวอย่างนั้นด้วยดังนั้นฉันหวังว่ามันจะได้ผล!
Derek Ekins

อ่า ใช่จุดที่ดีและฉันพลาดไปโดยสิ้นเชิง ในกรณีนั้นขอขอบคุณสำหรับทั้งสองตัวอย่าง
Peter Nixey

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

หากคุณต้องการทดสอบข้อความที่แสดงโดยเฉพาะนี่เป็นวิธีแฮ็กโดยเฉพาะ ฉันไม่รับรองว่ามันเป็นรหัสที่สวยงาม แต่มันทำให้งานลุล่วง คุณจะต้องโหลดhttp://plugins.jquery.com/node/1386/releaseหรือเปลี่ยนเป็นทำคุกกี้โดยกำเนิดหากคุณไม่ต้องการ jQuery

ใช้เรื่องราวประเภทนี้:

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
Matthew O'Riordan

3

การอัปเดตสิ่งนี้สำหรับ Capybara รุ่นปัจจุบัน ไดรเวอร์ 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



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.