web-dev-qa-db-fra.com

Comment émuler le survol de la souris avec Capybara

Fondamentalement, ce que j'essaie de faire, c'est de cliquer sur un bouton qui devient visible lors du survol d'un autre élément (son parent).

J'ai essayé d'utiliser trigger.('mouseover') sur le parent du bouton caché, mais cela ne semble pas fonctionner.

Voici un extrait de code de la spécification:

 # label[for ... ] -> the parent element
 page.execute_script("$('label[for=\"department_#{department.id}\"]').trigger(\"mouseover\")")     
 # le hidden button
 find(".actions").click     
 # some <li> on a list that drops down when clicking the hidden button    
 click_on("Edit department")

Et l'erreur ...

 Failure/Error: click_on("Edit department")
 Selenium::WebDriver::Error::ElementNotVisibleError:
 Element is not currently visible and so may not be interacted with

Je voudrais savoir comment faire le .actions bouton visible sur la page, pour le cliquer ensuite.

Toute aide serait très appréciée.

47
adritha84

Capybara fournit Element#hover méthode à partir de la version 2.1:

find('.some_class').hover

Cette méthode est implémentée dans Capybara::Selenium::Driver de la même manière que dans la réponse de @ AlexD.

Notez que pour utiliser #hover dans Selenium il est généralement préférable d'activer les événements natifs :

Capybara.register_driver :Selenium do |app|
  profile = Selenium::WebDriver::Firefox::Profile.new
  profile.native_events = true
  Capybara::Selenium::Driver.new(app, :browser => :firefox, profile: profile)
end
101
Andrei Botalov

Alex a décrit la solution de ces problèmes dans son blog: consultez-la http://aokolish.me/blog/2012/01/22/testing-hover-events-with-capybara

RSpec.configure do |config|
  # ...
  Capybara.javascript_driver = :webkit
end

page.find('#element').trigger(:mouseover)
18
Said Kaldybaev

J'ai trouvé un moyen de simuler le "survol de la souris" en utilisant Capybara + le pilote Selenium:

module Capybara
  module Node
    class Element
      def hover
        @session.driver.browser.action.move_to(self.native).perform
      end
    end
  end
end
7
Alex D

En utilisant Capybara + Selenium, il est possible d'utiliser "hover" avec cette commande:

page.driver.browser.action.move_to(page.find('YourElement').native).perform
4
tuhaj