2017-03-06 4 views
0

finden Ich habe folgende TestRspec Capybara webkit kippe Tag button

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 

und es schlägt mit der Nachricht

Capybara :: ElementNotFound: kann nicht css "# Menü-Taste" finden

ich habe auch versucht

click_on "Open Menu" 

click_button "Open Menu" 

click_link "Open Menu" 

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

find("#menu-button").click 

Ich versuche, die Off-Canvas-Funktion zu testen, die Foundation 6 hat.

application.html.erb Datei

<!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> 

die index.html.erb Datei

<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 %> 

rails_helper.rb Datei

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 

abort("The Rails environment is running in production mode!") if Rails.env.production? 
require 'spec_helper' 
require 'rspec/rails' 
require 'capybara/rspec' 
require 'simple_bdd/rspec' 

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    Capybara.javascript_driver = :webkit 
    config.include FactoryGirl::Syntax::Methods 

    config.include RSpecHtmlMatchers 

    config.include Devise::Test::IntegrationHelpers, type: :feature 

    config.use_transactional_fixtures = true 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

    config.infer_spec_type_from_file_location! 
    config.filter_rails_from_backtrace! 
end 

Shoulda::Matchers.configure do |config| 
    config.integrate do |with| 
    with.test_framework :rspec 
    with.library :rails 
    end 
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] 

meine qt Version ist 5.5.1 und ich bin auf Ubuntu 16.04

Antwort

2

standardmäßig Capybara nicht nicht-sichtbaren Elemente findet, und 99% der Zeit kann es nicht mit einem nicht sichtbaren Element interagieren. Dies liegt daran, dass das Verhalten eines Benutzers emuliert wird und ein Benutzer nicht mit etwas interagieren kann, das er auf der Seite nicht sehen kann.

UPDATE: jetzt, da Sie den gesamten Test enthalten haben, ist das Problem klarer. Sie stellen den Test nicht so ein, dass er verwendet wird: webkit, bis der Besuch "/" stattgefunden hat. Dies bedeutet, dass der: racktest-Treiber die Seite besucht, aber Sie dann zu dem: webkit-Treiber wechseln, der keine Seite tatsächlich geladen hat, so dass dort nichts ist. Anstatt manuell in der Testeinstellung current_driver sollten Sie einfach den Test mit js: true werden Tagging (oder driver: :webkit) Metadaten

scenario "should not have Javascript errors", js: true do 
    ... 
end 

Das dann wird der aktuelle Treiber auf den Wert von Capybara.javascript_driver eingestellt (die Sie festgelegt haben : webkit) bevor der Besuch stattfindet.

Außerdem fehlt Ihrem database_cleaner Setup ein bisschen - es sollte das vorgeschlagene Setup sein - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example - Der Wechsel von after nach append_after ist wichtig für die Stabilität des Tests und die Überprüfung des Treibertyps wird helfen, Ihre Tests zu beschleunigen.

Schließlich gibt es keine Notwendigkeit :type => :feature angeben, wenn Sie bereits RSpec.feature mit

+0

Hallo @ThomasWalpole, das 'off-canvas-content' ist sichtbares Element, ich habe auch' page.driver.console_messages' und 'page.driver.error_messages' versucht und habe keine Fehler bekommen. Aber, als ich die 'page.find (" # menu-button ") kommentiert habe, klicke auf' und habe die 'expected # zur Antwort auf 'has_errors?'Ich bin verwirrt mit dieser Nachricht, weil ich denke, dass es bedeutet, dass Webkit es nicht installiert ist. –

+0

@stupidone Die vollständigen Testinformationen machen es viel klarer - ich habe meine Antwort aktualisiert. –

0

Try visible: false zu Ihrem find Gespräch hinzugefügt wird, wie folgt aus:

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

Die gleiche Meldung. es hat nicht funktioniert. –

Verwandte Themen