Rails:Capybara :: ElementNotFound

时间:2017-10-25 17:03:54

标签: ruby-on-rails ruby rspec capybara

我正在尝试解决一个挑战,但我收到了来自Cabybara的错误消息:

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

我的new.html.erb是:

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

我的item_controller.rb是:

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

用于执行测试的rspec文件是:

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

我正在使用ruby-2.3.5和rails 4.1.0。 我是ruby / rails的初学者,我无法弄清楚我的代码有什么问题。 有人可以帮我解决这个问题吗? 我提前感激。

4 个答案:

答案 0 :(得分:0)

您可以这样做,假设您的输入的ID为name

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

或:

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

您也可以尝试下套Name

fill_in 'name', with: "Vostro 2017"

Capybara将定位名称或id属性,因此第二个示例应该有效。

答案 1 :(得分:0)

Rails使用表单对象生成表单输入名称。

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'

答案 2 :(得分:0)

如果您查看页面的实际HTML而不是erb模板(总是更好地包含HTML,除非您的问题是关于erb的),您会注意到您的标签实际上并未与输入元素相关联(没有匹配的f.label属性到输入的id)。显然,Capybara通过标签文本(在您的情况下为“名称”)找到元素,标签必须与元素正确关联。要解决此问题,您需要正确使用f.label :name, 'Name' - http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-label。如果你想指定元素的文本(vs使用从i18n翻译中提取的文本),那将是

ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ rb_file_s_symlink 

答案 3 :(得分:0)

我意识到我做错了什么,所以我们走吧: 我将def show action中的实例变量项更改为item(不是复数),并将属性从assetNumber更改为asset_number,这样Cabybara测试就能正确理解。

谢谢你们。