Як протестувати діалогове вікно підтвердження з огірком?


86

Я використовую Ruby on Rails з огірком і капібарою.

Як би я протестував просту команду підтвердження ("Ви впевнені?")?

Крім того, де я можу знайти подальшу документацію з цього питання?


Якщо ви використовуєте Capybara-webkit, ви знайдете там свою відповідь: stackoverflow.com/questions/6930927/…
Адріен

Відповіді:


62

Здається, на жаль, у Капібарі це зробити неможливо. Але якщо ви запускаєте свої тести з драйвером Selenium (і, мабуть, іншими драйверами, що підтримують JavaScript), ви можете його зламати. Перед тим, як виконати дію, яка призведе до діалогового вікна підтвердження, перевизначте confirmметод, щоб завжди повертати true. Таким чином діалогове вікно ніколи не відображатиметься, і ваші тести можуть продовжуватися так, ніби користувач натиснув кнопку OK. Якщо ви хочете імітувати зворотне, просто змініть його, щоб повернути false.

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 ..."
Германсен

134

Драйвер селену тепер це підтримує

З Capybara ви отримали б до нього доступ таким чином:

page.driver.browser.switch_to.alert.accept

або

page.driver.browser.switch_to.alert.dismiss

або

 page.driver.browser.switch_to.alert.text

2
Для тих, хто слідує за цим - зауважте, що відповідь Дерека дійсно працює там, де я виявив, що код в офіційній документації на Selenium ні (огірок / селен). Зверніть увагу на присутність page.driver.browserу відповіді Дерека
Пітера Ніксі

Пітер - код тут спеціально розроблений для використання capybara, тоді як код у документах призначений для того, коли ви використовуєте селен-веб-драйвер безпосередньо - я також написав цей приклад, тому сподіваюся, що це спрацює!
Дерек Екінс,

Ага. Так, хороший момент і повністю пропущений мною. У цьому випадку дякую за обидва приклади.
Пітер Ніксі

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 або змінити його, щоб робити файли cookie, якщо ви не хочете 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
Метью О'Ріордан

3

Оновлення для поточних версій Capybara. Більшість драйверів Capybara сьогодні підтримують модальний 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

1

Prickle додає кілька зручних методів зручності для роботи зі спливаючими вікнами в селені та webkit


0

Ця суть містить кроки для перевірки діалогового вікна підтвердження JS на рейках 2 та 3 за допомогою будь-якого драйвера Capybara.

Це адаптація попередньої відповіді, але не потребує плагіна jQuery Cookie.


0

Спробував вищевказані відповіді без удачі. Врешті-решт це спрацювало для мене:

@browser.alert.ok
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.