Làm thế nào để kiểm tra hộp thoại xác nhận với Cucumber?


86

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?


Nếu bạn đang sử dụng Capybara-webkit, bạn sẽ tìm thấy câu trả lời của mình ở đó: stackoverflow.com/questions/6930927/…
Adrien

Câu trả lời:


62

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 đè confirmphươ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')

Điều này dường như không còn hoạt động nữa trong Firefox 4 ... @ derek-ekins giải pháp bên dưới, theo những gì Google cho tôi biết, có vẻ tương thích về phía trước hơn, mặc dù tôi chưa thể xác nhận (tôi đang mắc kẹt trên Capybara 0,3,9).
carpeliam

1
Xem câu trả lời dưới đây để biết cách sử dụng "page.driver.browser.switch_to ..."
Thorbjørn Hermansen

134

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

2
Đối với bất kỳ ai khác theo dõi điều này - xin lưu ý rằng câu trả lời của Derek thực sự hoạt động khi tôi nhận thấy rằng mã trong tài liệu chính thức về Selenium thì không (dưa chuột / Selenium). Lưu ý sự có mặt của page.driver.browsertrong câu trả lời của Derek
Peter Nixey

Peter - mã ở đây được thiết kế riêng để sử dụng capybara trong khi mã trong tài liệu dành cho khi bạn đang sử dụng trực tiếp selenium-webdriver - tôi cũng đã viết ví dụ đó vì vậy tôi hy vọng nó hoạt động!
Derek Ekins,

Ahh. Vâng, điểm tốt và hoàn toàn bị bỏ lỡ bởi tôi. Trong trường hợp đó, cảm ơn bạn vì cả hai ví dụ.
Peter Nixey

39

Tôi đã triển khai hai bước web này trong /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

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

2
Giải pháp mát mẻ! Tôi lật nó xung quanh một chút mà cảm thấy tự nhiên hơn với tôi: gist.github.com/727614
Mat Schaffer

Và đây là một phiên bản khác của mã đó hỗ trợ cả hộp cảnh báo và xác nhận, gist.github.com/919116
Matthew O'Riordan

3

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



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

1

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


0

Ý 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.


0

Đã 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.