2017-10-25 4 views
0

Ich versuche, eine Herausforderung zu lösen, aber ich erhielt eine Fehlermeldung von Cabybara sagen:Rails: Capybara :: ElementNotFound

`Failure/Error: fill_in 'Name', with: 'Vostro 2017' 
    Capybara::ElementNotFound: Unable to find visible field "Name" that is not disabled` 

Mein new.html.erb ist:

<%= form_for @item, url: {action: "create"} do |f|%> 
    <%= f.label 'Name' %> 
    <%= f.text_field :name %> 
    <%= f.label 'Description' %> 
    <%= f.text_field :description %> 
    <%= f.label 'Features' %> 
    <%= f.text_field :features %> 
    <%= f.label 'Asset number' %> 
    <%= f.text_field :assetNumber %> 
    <%= f.submit%> 
<% end %> 

Und mein item_controller.rb ist :

class ItemController < ApplicationController 
    def show 
    @items = Item.find(params[:id]) 
    end 
    def new 
    @item = Item.new 
    end 

    def create 
    @item = Item.new(item_params) 

    @item.save 
    redirect_to @item 
    end 

    private 
    def item_params 
    params.require(:item).permit(:name, :description, :features, :assetNumber) 
    end 
end 

die rspec-Datei, die verwendet wird, um den Test zu tun ist:

require 'rails_helper' 

feature 'User creates a new inventory item' do 
    scenario 'successfully' do 
    visit new_item_path 
    fill_in 'Name', with: 'Vostro 2017' 
    fill_in 'Description', with: 'Dell Notebook' 
    fill_in 'Features', with: '16gb, 1Tb, 15.6"' 
    fill_in 'Asset number', with: '392 DLL' 
    click_button 'Create Item' 

    expect(page).to have_content 'Vostro 2017' 
    expect(page).to have_content 'Dell Notebook' 
    expect(page).to have_content '16gb, 1Tb, 15.6"' 
    expect(page).to have_content '392 DLL' 
    end 
end 

Ich benutze Ruby-2.3.5 und Schienen 4.1.0. Ich bin Anfänger in Ruby/Rails und ich kann nicht herausfinden, was mit meinem Code falsch ist. Kann mir jemand helfen, das zu lösen? Ich schätze im Voraus.

+0

Können Sie die Frage mit dem Modal auch bitte aktualisieren. –

+0

@Ziyan Junaideen was ist modal? – viniCdaSilva

Antwort

0

Sie dies tun könnte, Ihre Eingabe unter der Annahme, eine ID von name hat:

find("input[id$='name']").set "Vostro 2017" 

oder:

find("#name").set "Vostro 2017" 

Sie könnten auch versuchen unteren Gehäuse Name:

fill_in 'name', with: "Vostro 2017" 

Capybara zielt auf den Namen oder das ID-Attribut, also sollte das zweite Beispiel funktionieren.

+0

Der Besitzer der Herausforderung möchte nicht, wenn die Testdatei geändert wird. – viniCdaSilva

0

Rails generiert Formulareingabe-Namen mit dem form-Objekt.

fill_in 'item[name]', with: "Vostro 2017" 
fill_in 'item[description]', with: 'Dell Notebook' 
fill_in 'item[features]', with: '16gb, 1Tb, 15.6"' 
fill_in 'item[assetNumber]', with: '392 DLL' 
0

Wenn man sich den tatsächlichen HTML-Code der Seite anstelle der erb-Vorlage (immer besser ist die HTML-es sei denn, Ihre Frage speziell über die erb ist) werden Sie Ihre Beschriftungen sind nicht wirklich im Zusammenhang mit die Eingabeelemente (kein übereinstimmendes Attribut for mit der ID der Eingabe). Offensichtlich muss Capybara das Element anhand des Beschriftungstexts (in Ihrem Fall "Name") finden, damit das Etikett korrekt mit dem Element verknüpft werden kann. Um das zu beheben, müssen Sie f.label - http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-label - richtig verwenden. Wenn Sie den Text des Elements angeben möchten (vs Text aus i18n Übersetzung extrahiert mit) wäre das

f.label :name, 'Name' 
+0

Toller Tipp. Danke vielmals. – viniCdaSilva

0

ich erkannte, was ich falsch mache, so gehen wir: änderte ich die Instanzvariable Elemente in def show action to item (nicht pluralisiert) und ich habe ein Attribut von assetNumber in asset_number geändert, damit der Cabybara-Test richtig funktioniert.

Danke Jungs.

Verwandte Themen