如何使用Capybara模拟鼠标悬停

adr*_*a84 47 rspec ruby-on-rails capybara

基本上,我要做的是点击一个按钮,当悬停在另一个元素(其父元素)时变为可见.

我试图trigger.('mouseover')在隐藏按钮的父级上使用,但这似乎不起作用.

这是规范中的代码片段:

 # 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")
Run Code Online (Sandbox Code Playgroud)

错误......

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

我想知道如何.actions在页面上显示按钮,以便之后点击它.

任何帮助将非常感激.

And*_*lov 104

Capybara提供2.1版本的Element#hover方法:

find('.some_class').hover
Run Code Online (Sandbox Code Playgroud)

该方法的实现Capybara::Selenium::Driver方式与@ AlexD的答案几乎相同.

请注意,要#hover在Selenium中使用,通常最好打开本机事件:

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
Run Code Online (Sandbox Code Playgroud)


Sai*_*aev 18

亚历克斯在他的博客中描述了这些问题的解决方案:检查出来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)
Run Code Online (Sandbox Code Playgroud)

  • 如何克服`Capybara :: NotSupportedByDriverError`错误? (3认同)
  • @Hengjie`page.execute_script('$("#element").trigger("mouseenter")')` (3认同)

Ale*_*x D 7

我找到了一种使用Capybara + Selenium驱动程序来模拟"鼠标悬停"的方法:

module Capybara
  module Node
    class Element
      def hover
        @session.driver.browser.action.move_to(self.native).perform
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


tuh*_*haj 6

使用 Capybara + Selenium 可以通过以下命令使用“hover”:

page.driver.browser.action.move_to(page.find('YourElement').native).perform
Run Code Online (Sandbox Code Playgroud)