水豚无法找到文件输入

Capybara unable to find file input

为什么 Capybara (2.8.0) 无法找到我的文件输入? (如果我从调试器检查 page.body,则输入存在。)

And(/^if I add a large image$/) do
  within all('.title').first do
    attach_file('.file-input', test_file)
  end
end

# Cucumber error message
And if I add a large image # features/step_definitions/story_steps.rb:466
  Unable to find file field ".file-input" (Capybara::ElementNotFound)
  ./features/step_definitions/story_steps.rb:468:in `block (2 levels) in <top (required)>'
  ./features/step_definitions/story_steps.rb:467:in `/^if I add a large image$/'
  features/long_form_features.feature:450:in `And if I add a large image'

编辑:我可以使用 ID (attach_file 'file_input', test_file ) 找到输入,但我真的不想为了让这个测试工作而必须将 ID 添加到我的所有输入中。有什么方法可以将现有的 类 与 Capybara 结合使用吗?

很可能实际的文件输入元素在页面上被隐藏了。通常这样做是为了允许跨多个平台对文件输入进行相同的样式设置。使用 #execute_script 删除输入中的任何 CSS 使其在页面上不可见,然后对其调用 #attach_file

更新:我没有注意到您试图使用 class 来定位字段。因为 documented #attach_file 采用元素名称、id 或关联标签的文本来查找元素,而不是 css 选择器。如果你真的需要通过 class 查找,并且必须停留在你使用的 Capybara 版本上,你可以这样做

find('.file-input').set(test_file)

或者如果您更新到 Capybara 2.10+,您应该可以做到

attach_file(test_file, class: 'file-input')

此外,within all('.title').first 可以只是 within first('.title'),尽管如果需要,它们都不会实际等待元素出现在页面上,您最好将其写为 within first('.title', minimum: 1)