用Capybara测试焦点

Jak*_*old 15 integration-testing rspec capybara ruby-on-rails-3

link_to_function我的视图模板中有一个简单的

<%= link_to_function "add new category", "$('#category_name').focus()" %>
Run Code Online (Sandbox Code Playgroud)

我想用capybara使用请求规范对此进行测试.基本上规范看起来应该是这样的

it "focuses category form when I click 'add new category'" do
  visit new_article_path
  click_link "add new category"

  # unfortunately there's nothing like 'has_focus?'
  find_field("category_name").should have_focus  
end
Run Code Online (Sandbox Code Playgroud)

问题是,我无法找到任何东西,这将检查元素是否具有焦点. 我唯一能找到的就是这个

page.evaluate_script('document.focus')[:id]
Run Code Online (Sandbox Code Playgroud)

然而,capybara-wekbit驱动程序不支持,我正在使用它来避免每次测试运行打开浏览器.

cut*_*ion 24

我刚刚使用了以下代码(使用phantomjs驱动程序,但我相信它也适用于webkit):

page.evaluate_script("document.activeElement.id") == "some_id"
Run Code Online (Sandbox Code Playgroud)

PS一年的问题没有答案.他们应该给我一张徽章吗?:)


Mik*_*ski 7

你应该使用:focus选择器,例如:

page.should have_selector('#category_name:focus')
Run Code Online (Sandbox Code Playgroud)

  • CSS会暗示这一点,但似乎Capybara/Poltergeist没有正确处理:焦点选择器.我总是得到':focus'的空结果,即使document.activeElement告诉我它有正确的HTMLInputElement焦点. (5认同)
  • @JornvandeBeek与Selenium合作得很好 (2认同)

Tam*_*lyn 7

使用 Selenium 驱动程序,您可以获得焦点元素:

page.driver.browser.switch_to.active_element
Run Code Online (Sandbox Code Playgroud)

然后你就可以用它做你喜欢做的事

page.driver.browser.switch_to.active_element.send_keys "some text"
Run Code Online (Sandbox Code Playgroud)

请注意,它返回 aSelenium::WebDriver::Elementfind返回 a Capybara::Node::Element,因此在比较它们时要小心

expect(page.driver.browser.switch_to.active_element).to eql(find('#some-element').native)
Run Code Online (Sandbox Code Playgroud)