Как подтвердить всплывающее окно javascript с помощью Capybara? - PullRequest
64 голосов
/ 03 августа 2011

Я попробовал несколько примеров, найденных в сети, но безуспешно.Я жду подтверждения сообщения об удалении ссылки.Последней попыткой был приведенный ниже код, но это привело к ошибке Capybara :: NotSupportedByDriverError.

def confirm_dialog
  page.evaluate_script('window.confirm = function() { return true; }')
end

Ответы [ 8 ]

51 голосов
/ 03 августа 2011

Прежде всего переключитесь на использование Selenium в качестве драйвера, поместив тег @javascript перед сценарием.

Следующий код на шаге огурца подтвердит диалог:

page.driver.browser.switch_to.alert.accept
# or
page.driver.browser.switch_to.alert.dismiss
# or
page.driver.browser.switch_to.alert.text

Как сказал @NobbZ, этот вопрос уже задавался и отвечался здесь: Как проверить диалог подтверждения с Cucumber? .

Более подробная документация по селену доступна здесь: http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

41 голосов
/ 20 июля 2016

Добавление ответа для тех, кто ударил по этому в 2016 году и в последующий период. Теперь вы можете использовать Капибару напрямую, чтобы принять окно подтверждения. Вы делаете это путем переноса кода, который вызывает появление окна подтверждения в функции accept_confirm .

accept_confirm do
  click_link 'Destroy'
end
15 голосов
/ 20 апреля 2013

для капибара-вебкита:

page.driver.browser.accept_js_confirms
page.driver.browser.reject_js_confirms

, который все еще работает, но в документации также сказано:

page.driver.accept_js_confirms!
page.driver.accept_js_confirms!

См. https://github.com/thoughtbot/capybara-webkit, поиск "accept_js_confirms"

9 голосов
/ 11 сентября 2013

У меня были проблемы с синхронизацией диалоговых окон браузера в среде CI, поэтому я запрашиваю диалог, прежде чем его принять:

def accept_browser_dialog
  wait = Selenium::WebDriver::Wait.new(:timeout => 30)
  wait.until {
    begin
      page.driver.browser.switch_to.alert
      true
    rescue Selenium::WebDriver::Error::NoAlertPresentError
      false
    end
  }
  page.driver.browser.switch_to.alert.accept
end
6 голосов
/ 02 августа 2013

Мне пришлось использовать сон в тесте webkit, так как он провалится каждый раз, а затем в противном случае.

Вот что я придумал после прочтения всяких постов:

if page.driver.class == Capybara::Selenium::Driver
  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.accept_js_confirms
else
  raise "Unsupported driver"
end
2 голосов
/ 04 апреля 2017

В Капибаре очень просто принять окно модели.Даже мы можем сделать то же самое в селене, но это немного сложно для людей, которые не знают о селене.

page.accept_modal # Это примет модальное окно

page.dismiss_modal # Это отклонит/ Отклонить модальное окно

2 голосов
/ 03 августа 2011

попробуйте добавить :js => true к вашему тесту.

Функция метаданных RSpec может использоваться для переключения на другой драйвер. Используйте: js => true, чтобы переключиться на драйвер javascript или предоставить : опция драйвера для переключения на один конкретный драйвер. Например:

it 'will use the default js driver' :js => true do
  ...
end
2 голосов
/ 03 августа 2011

Полагаю, вам нужно добавить селен в ваш gem-файл и настроить его, а также капибару, в которой капибара использует селен в качестве драйвера.

Я также думаю, что Как проверить диалог подтверждения с огурцом? очень похож на ваш вопрос, особенно принятый ответ.

...