ฉันใช้ Ruby on Rails กับ Cucumber และ Capybara
ฉันจะทดสอบคำสั่งยืนยันอย่างง่ายได้อย่างไร ("แน่ใจหรือ")
นอกจากนี้ฉันจะหาเอกสารเพิ่มเติมเกี่ยวกับปัญหานี้ได้ที่ไหน
ฉันใช้ Ruby on Rails กับ Cucumber และ Capybara
ฉันจะทดสอบคำสั่งยืนยันอย่างง่ายได้อย่างไร ("แน่ใจหรือ")
นอกจากนี้ฉันจะหาเอกสารเพิ่มเติมเกี่ยวกับปัญหานี้ได้ที่ไหน
คำตอบ:
ดูเหมือนว่าจะไม่มีทางทำได้ใน Capybara น่าเสียดาย แต่ถ้าคุณกำลังทำการทดสอบด้วยไดรเวอร์ Selenium (และอาจเป็นไดรเวอร์อื่น ๆ ที่รองรับ JavaScript) คุณสามารถแฮ็คได้ ก่อนที่จะดำเนินการที่จะเปิดกล่องโต้ตอบยืนยันให้แทนที่confirm
เมธอดเพื่อคืนค่าจริงเสมอ ด้วยวิธีนี้กล่องโต้ตอบจะไม่ปรากฏขึ้นและการทดสอบของคุณจะดำเนินต่อไปได้ราวกับว่าผู้ใช้กดปุ่มตกลง หากคุณต้องการจำลองการย้อนกลับเพียงแค่เปลี่ยนเป็นคืนค่าเท็จ
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
ไดรเวอร์ซีลีเนียมรองรับสิ่งนี้แล้ว
จาก Capybara คุณจะเข้าถึงได้ดังนี้:
page.driver.browser.switch_to.alert.accept
หรือ
page.driver.browser.switch_to.alert.dismiss
หรือ
page.driver.browser.switch_to.alert.text
page.driver.browser
คำตอบของ Derek
ฉันได้ใช้สองขั้นตอนบนเว็บนี้ใน/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
หากคุณต้องการทดสอบข้อความที่แสดงโดยเฉพาะนี่เป็นวิธีแฮ็กโดยเฉพาะ ฉันไม่รับรองว่ามันเป็นรหัสที่สวยงาม แต่มันทำให้งานลุล่วง คุณจะต้องโหลด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
การอัปเดตสิ่งนี้สำหรับ 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
ซึ่งจะคลิกปุ่มชื่อจากนั้นยอมรับกล่องยืนยันที่มีข้อความตรงกับข้อความ
capybara-WebKitสนับสนุนโปรแกรมควบคุมที่นี้เช่นกัน
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
Prickleเพิ่มวิธีอำนวยความสะดวกบางอย่างสำหรับการทำงานกับป๊อปอัปในซีลีเนียมและ webkit
ส่วนสำคัญนี้มีขั้นตอนในการทดสอบข้อความยืนยัน JS ใน Rails 2 และ 3 ด้วยไดรเวอร์ Capybara
เป็นการปรับคำตอบก่อนหน้านี้ แต่ไม่จำเป็นต้องใช้ปลั๊กอิน jQuery Cookie
ลองคำตอบข้างต้นโดยไม่มีโชค ในที่สุดสิ่งนี้ก็ได้ผลสำหรับฉัน:
@browser.alert.ok