web-dev-qa-db-fra.com

Comment puis-je confirmer une popup javascript avec Capybara?

J'ai essayé plusieurs exemples trouvés en ligne, mais sans succès. Je cherche à confirmer le message de confirmation d'un lien de suppression. La dernière tentative était le code ci-dessous, mais cela a entraîné une erreur Capybara :: NotSupportedByDriverError.

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

Commencez tout d'abord par utiliser Selenium comme pilote en plaçant une balise @javascript devant votre scénario.

Le code suivant dans votre étape de concombre confirmera alors le dialogue:

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

Comme @NobbZ l'a dit, cette question a déjà été posée et répondue ici: Comment tester une boîte de dialogue de confirmation avec Cucumber? .

Plus de documentation Selenium disponible ici aussi: http://code.google.com/p/Selenium/wiki/RubyBindings#JavaScript_dialogs

51
Peter Nixey

Ajout d'une réponse pour ceux qui ont frappé cela en 2016 et au-delà. Vous pouvez désormais utiliser Capybara directement pour accepter une boîte de confirmation. Pour ce faire, vous encapsulez le code qui fait apparaître la boîte de confirmation dans la fonction accept_confirm .

accept_confirm do
  click_link 'Destroy'
end
42
retroGiant

pour capybara-webkit:

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

qui fonctionne toujours, mais la documentation dit aussi:

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

Voir https://github.com/thoughtbot/capybara-webkit , recherchez "accept_js_confirms"

15
magicgod

J'ai eu des problèmes de synchronisation avec les boîtes de dialogue du navigateur dans un environnement CI, donc je recherche une boîte de dialogue avant de l'accepter:

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
10
Stephan Seidt

J'ai dû utiliser un sommeil dans le test de webkit car il échouerait de toute façon et ensuite sinon.

Voici ce que j'ai trouvé après avoir lu les articles de tout le monde:

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
6
Michael Yagudaev

À Capybara, il est très simple d'accepter la fenêtre du modèle. Même nous pouvons faire de même dans le sélénium, mais c'est un peu difficile pour les gens qui ne connaissent pas le sélénium.

page.accept_modal #This acceptera la fenêtre modale

page.dismiss_modal #Cela rejettera/rejetera la fenêtre modale

2
Jagan

Je suppose que vous devez ajouter Selenium à votre fichier gem et le configurer et capybara que capybara utilise Selenium comme pilote.

Je pense aussi que Comment tester une boîte de dialogue de confirmation avec Cucumber? est très similaire à votre question, en particulier la réponse acceptée.

2
NobbZ

essayez d'ajouter :js => true à votre test.

La fonction de métadonnées de RSpec peut être utilisée pour basculer vers un autre pilote. Utilisez: js => true pour basculer vers le pilote javascript, ou fournissez une option: driver pour basculer vers un pilote spécifique. Par exemple:

it 'will use the default js driver' :js => true do
  ...
end
2
Vasiliy Ermolovich