2010-03-16 2 views
82

Я использую Ruby on Rails с огурцом и Capybara.Как проверить диалог подтверждения с огурцом?

Как я могу протестировать простую команду подтверждения («Вы уверены?»)?

Кроме того, где можно найти дополнительную документацию по этой проблеме?

+0

Если вы используете Capybara-webkit, вы найдете свой ответ там: http://stackoverflow.com/questions/6930927/how-do-i-confirm-a-javascript-popup-with-capybara# – Adrien

ответ

59

Кажется, что нет возможности сделать это в Капибаре, к сожалению. Но если вы проводите тесты с помощью драйвера Selenium (и, возможно, других драйверов, поддерживающих JavaScript), вы можете его взломать. Перед выполнением действия, которое приведет к диалогу подтверждения, переопределите метод confirm, чтобы всегда возвращать значение true. Таким образом, диалог никогда не будет отображаться, и ваши тесты могут продолжаться так, как если бы пользователь нажал кнопку OK. Если вы хотите имитировать обратное, просто измените его, чтобы вернуть false.

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

awesome! Спасибо! –

+0

Это, похоже, больше не работает в Firefox 4 ... @ derek-ekins решение ниже, из того, что Google говорит мне, кажется, более передовым, хотя я пока не могу подтвердить (я застрял на Капибара 0.3.9). – carpeliam

+1

См. Ответ ниже для использования «page.driver.browser.switch_to ...» –

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

Прохладное решение! Я перевернул его немного, что мне кажется более естественным: https://gist.github.com/727614 –

+0

И вот еще одна версия этого кода, которая поддерживает как предупреждения, так и флажки подтверждения, https://gist.github.com/ 919116 –

131

Драйвер селеном now supports this

С Капибара доступ будет так:

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' в ответе Дерека –

+0

Peter - код здесь специально предназначен для использования capybara, тогда как код в документах используется, когда вы используете selenium-webdriver напрямую - я тоже написал этот пример Надеюсь это работает! –

+0

Ahh. Да, хороший момент и полностью упустил меня. В этом случае спасибо вам за оба примера. –

38

Я выполнил эти две веб шаги в /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 
+0

сладкий! оно работает! – corroded

0

This gist имеет шаги, чтобы проверить диалоговое окно подтверждения JS в Rails 2 и 3 с любой водитель Capybara.

Это адаптация предыдущего ответа, но не требуется плагин jQuery Cookie.

1

Prickle добавляет некоторые полезные удобные методы для работы с всплывающими окнами в селене и WebKit

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 
0

Пробовал вышеуказанные ответы без везения. В итоге это сработало для меня:

@browser.alert.ok 
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 

который будет нажать именованный кнопку, а затем принять окно подтверждения с текстом согласования сообщ

Смежные вопросы