Ruby on rails Rspec水豚网络工具包找不到按钮标签

Ruby on rails Rspec水豚网络工具包找不到按钮标签,ruby-on-rails,rspec,capybara,rspec-rails,capybara-webkit,Ruby On Rails,Rspec,Capybara,Rspec Rails,Capybara Webkit,我有以下测试 require "rails_helper" RSpec.feature "Menu", :type => :feature do let!(:articles) { create_list(:article, 10) } let!(:quotes) { create_list(:quote, 2) } before { visit "/" } scenario "should not have Javascript errors" do Capybar

我有以下测试

require "rails_helper"

RSpec.feature "Menu", :type => :feature do

 let!(:articles) { create_list(:article, 10) }
 let!(:quotes) { create_list(:quote, 2) }

 before { visit "/" }

 scenario "should not have Javascript errors" do
   Capybara.current_driver = :webkit

   page.find("#menu-button").click

   expect(page).not_to have_errors
 end

end
但它却失败了

Capybara::ElementNotFound: 找不到css“#菜单按钮”

我也试过了

click_on "Open Menu"

click_button "Open Menu"

click_link "Open Menu"

page.find_button(id: 'menu-button').click

find("#menu-button").click

我尝试测试基础6所具有的画布特征。

application.html.erb文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<title><%= content_for?(:title) ? yield(:title) : "Stargazers.news" %></title>

<%= stylesheet_link_tag    "application" %>
<%= javascript_include_tag "application", 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<div class="off-canvas-wrapper">

  <div class="off-canvas position-left" id="offCanvas" data-off-canvas>
    <button class="close-button" arial-label="Close menu" type="button" data-close></button>

    <div id="search">
      <%= form_tag({controller: "/pages", action:"search"}, method: "get") do %>
        <%= label_tag(:search, "Search for:") %>
        <%= text_field_tag(:search) %>
        <%= submit_tag("Search") %>
      <% end %>
    </div>    
  </div>

  <div class="off-canvas-content" data-off-canvas-content>
    <div class="top-bar">
      <div class="top-bar-right">
        <button id="menu-button" type="button" class="button" data-toggle="offCanvas">Open Menu</button>
      </div>
    </div>

    <p class="notice"><%= notice %></p>
    <p class="alert"><%= alert %></p>

    <%= yield %>
  </div>

</div>
</body>
</html>
<div id="quote">
  <%= @quote.body %>
</div>

<% @articles.each do |article| %>
  <article>
    <header> <%= article.title%> </header>
    <div class="content-summary"> <%= article.body %> </div>
  </article>
  <hr/>
<% end %>
Gemfile

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '~> 5.0.1'
gem 'pg', '~> 0.18'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'foundation-rails'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'jquery-rails'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem "paperclip", "~> 5.0.0"
gem 'devise'

group :development, :test do
  gem 'byebug', platform: :mri
  gem 'factory_girl_rails'
  gem 'rspec-rails', '~> 3.5'
  gem 'rspec-html-matchers'
  gem 'ffaker'
  gem 'simple_bdd'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem "better_errors"
end

group :test do
  gem 'capybara-webkit'
  gem 'database_cleaner'
  gem 'shoulda-matchers', '~> 3.1'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
我的qt版本是5.5.1
我在Ubuntu 16.04上

尝试将
visible:false
添加到您的
find
调用中,如下所示:

page.find("#menu-button", visible: false).click

尝试将
visible:false
添加到
find
调用中,如下所示:

page.find("#menu-button", visible: false).click

默认情况下,水豚找不到不可见的元素,99%的时间它无法与不可见的元素交互。这是因为它被设计来模拟用户的行为,用户不能与他们在页面上看不到的东西进行交互

更新:既然你已经包括了整个测试,问题就更清楚了。在访问“/”发生之前,您不会将测试设置为使用:webkit。这意味着:racktest驱动程序会访问该页面,但您会切换到:webkit驱动程序,该驱动程序实际上没有加载任何页面,因此没有任何内容。与其在测试中手动设置当前的驱动程序,不如使用
js:true
(或
driver::webkit
)元数据标记测试

然后在访问发生之前,将当前驱动程序设置为Capybara.javascript_driver的值(您已将其设置为:webkit)

此外,您的数据库\u cleaner设置有点不足-这应该是建议的设置-从after到append \u after的交换对于测试稳定性很重要,并且对驱动程序类型的检查将有助于加快测试速度


最后,如果您已经在使用
RSpec.feature
,则无需指定
:type=>:feature
,默认情况下,水豚找不到不可见的元素,99%的时间它无法与不可见的元素交互。这是因为它被设计来模拟用户的行为,用户不能与他们在页面上看不到的东西进行交互

更新:既然你已经包括了整个测试,问题就更清楚了。在访问“/”发生之前,您不会将测试设置为使用:webkit。这意味着:racktest驱动程序会访问该页面,但您会切换到:webkit驱动程序,该驱动程序实际上没有加载任何页面,因此没有任何内容。与其在测试中手动设置当前的驱动程序,不如使用
js:true
(或
driver::webkit
)元数据标记测试

然后在访问发生之前,将当前驱动程序设置为Capybara.javascript_driver的值(您已将其设置为:webkit)

此外,您的数据库\u cleaner设置有点不足-这应该是建议的设置-从after到append \u after的交换对于测试稳定性很重要,并且对驱动程序类型的检查将有助于加快测试速度


最后,如果您已经在使用
RSpec.feature

hello@ThomasWalpole,则无需指定
:type=>:feature
,因为
非画布内容
是可见元素,我还尝试了
页面.driver.console\u消息
页面.driver.error\u消息
,我没有收到任何错误。但是,当我对
页面进行注释时。查找(#菜单按钮”)。单击
并获得预期的
响应“has#u errors?”
消息。我对这条消息感到困惑,因为我认为这意味着它没有安装webkit。@stupidone有完整的测试信息,这使它更清楚了——我更新了我的答案。你是对的,我也面临同样的问题,但在添加了js:true之后,它现在工作得很好,谢谢你Hello@ThomasWalpole,
非画布内容
是可见元素,我也尝试了
页面驱动程序控制台消息
页面驱动程序错误消息
,但没有收到任何错误。但是,当我对
页面进行注释时。查找(#菜单按钮”)。单击
并获得预期的
响应“has#u errors?”
消息。我对这条消息感到困惑,因为我认为这意味着它没有安装webkit。@stupidone有完整的测试信息,这使它更清楚了——我更新了我的答案。你是对的,我也面临同样的问题,但在添加了js:true之后,它现在工作得很好,谢谢
scenario "should not have Javascript errors", js: true do
  ...
end