使用cocoon和capybara上传多个文件

时间:2016-02-23 12:59:19

标签: ruby-on-rails capybara carrierwave capybara-webkit cocoon-gem

我在测试使用capybara使用cocoon上传多个文件时遇到了问题。如何找到id: "image"的所有字段并附加到每个字段?

这是我的测试代码:

  click_link "Add photo"
  wait_for_ajax

  click_link "Add photo"
  wait_for_ajax


  page.all(:class, '.attach_fileds').each do |el|
    attach_file( el, "#{Rails.root}/spec/assets/example.jpg")
  end

  click_button "Add"

  expect(Post.count).to eq(1)
  expect(Post.last.images.size).to eq(2)

错误讯息: Unable to find file field #<Capybara::Element tag="input" path="/html/body/div/div/div/form[@id='new_post']/div[@id='educations']/div[1]/input[@id='image']">

1 个答案:

答案 0 :(得分:1)

你不应该有多个具有相同id的元素,因为那是非法的html。根据你的示例代码(不确定:类选择器是如此猜测)你真的希望每个元素都有一个&#39; attach_field&#39;类。 #attach_file不会将元素作为其第一个参数,而是采用元素的名称,ID或标签文本。由于你已经有了元素,你可以在每个元素上调用#set

page.all(:css, '.attach_field').each do |el
  el.set "path of file to upload"
end

如果您只想要输入每个文件

page.all(:css, 'input[type="file"]').each do |el|
  el.set "path of file to upload")
end

另请注意,您需要click_button "Add"expect(Post.count).to eq(1)之间的某些内容才能让测试等待提交完成 - 例如

expect(page).to have_text('Image Uploaded') # if the page adds text when image is uploaded

expect(page).to have_current_path('/some_new_path') # if the page url changes after the upload is complete