Tôi đang sử dụng Ruby on Rails với Cucumber và Capybara.
Làm cách nào để tôi kiểm tra một lệnh xác nhận đơn giản ("Bạn có chắc không?")?
Ngoài ra, tôi có thể tìm thêm tài liệu về vấn đề này ở đâu?
Tôi đang sử dụng Ruby on Rails với Cucumber và Capybara.
Làm cách nào để tôi kiểm tra một lệnh xác nhận đơn giản ("Bạn có chắc không?")?
Ngoài ra, tôi có thể tìm thêm tài liệu về vấn đề này ở đâu?
Câu trả lời:
Có vẻ như không có cách nào để làm điều đó ở Capybara, thật không may. Nhưng nếu bạn đang chạy thử nghiệm với trình điều khiển Selenium (và có thể là các trình điều khiển khác hỗ trợ JavaScript), bạn có thể hack nó. Ngay trước khi thực hiện hành động sẽ hiển thị hộp thoại xác nhận, hãy ghi đè confirm
phương thức để luôn trả về true. Bằng cách đó, hộp thoại sẽ không bao giờ được hiển thị và các thử nghiệm của bạn có thể tiếp tục như thể người dùng đã nhấn nút OK. Nếu bạn muốn mô phỏng ngược lại, chỉ cần thay đổi nó để trả về false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Trình điều khiển selen hiện hỗ trợ điều này
Từ Capybara, bạn sẽ truy cập nó như thế này:
page.driver.browser.switch_to.alert.accept
hoặc là
page.driver.browser.switch_to.alert.dismiss
hoặc là
page.driver.browser.switch_to.alert.text
page.driver.browser
trong câu trả lời của Derek
Nếu bạn muốn kiểm tra cụ thể thông báo đang được hiển thị, đây là một cách đặc biệt khó hiểu để làm như vậy. Tôi không xác nhận nó là mã đẹp, nhưng nó hoàn thành công việc. Bạn sẽ cần tải http://plugins.jquery.com/node/1386/release hoặc thay đổi nó để tạo cookie nguyên bản nếu bạn không muốn jQuery.
Sử dụng loại câu chuyện này:
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
Và các bước này
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
Cập nhật điều này cho các bản phát hành hiện tại của Capybara. Hầu hết các trình điều khiển Capybara ngày nay đều hỗ trợ API phương thức. Để chấp nhận một phương thức xác nhận, bạn sẽ làm
accept_confirm do # dismiss_confirm if not accepting
click_link 'delete' # whatever action triggers the modal to appear
end
Điều này có thể được sử dụng trong Cucumber với những thứ như
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
sẽ nhấp vào nút được đặt tên và sau đó chấp nhận hộp xác nhận với tin nhắn phù hợp với văn bản
Trình điều khiển capybara-webkit cũng hỗ trợ điều này.
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 bổ sung một số phương pháp tiện lợi hữu ích để làm việc với cửa sổ bật lên trong selen và webkit
Ý chính này có các bước để kiểm tra hộp thoại xác nhận JS trong Rails 2 và 3 với bất kỳ trình điều khiển Capybara nào.
Đây là một bản chuyển thể của câu trả lời trước đó, nhưng không cần plugin jQuery Cookie.
Đã thử các câu trả lời trên mà không gặp may. Cuối cùng điều này đã làm việc cho tôi:
@browser.alert.ok