如何使用Rails,Cucumber和Capybara测试Dropzone.js上传?
我有一个使用Cucumber和Capybara进行测试的Rails项目。 我有一个使用Dropzone.js的文件上传页面。
我的上传工作很有用,可以使用对话框或拖放。 测试是另一回事。
我的表格中有以下字段:
但是,在步骤定义中,我尝试了一些查找和附加文件数据的方法,但它们都不起作用。
我试过fill_in:
fill_in "photo_image", with: photo
我试过用css选择器找到:
find('#photo_image').set photo
我试过用xpath找到:
find(:xpath, "//input[@id='photo_image']").set photo
但他们都没有看到隐藏的领域。
Unable to find css "#photo_image" (Capybara::ElementNotFound) Unable to find xpath "//input[@id='photo_image']" (Capybara::ElementNotFound) Unable to find field "photo_image" (Capybara::ElementNotFound)
有没有可以使用Dropzone.js处理上传的测试方法还是没有希望?
Capybara 2.1 默认情况下找不到隐藏元素 。
您可以将ignore_hidden_elements
设置为false:
Capybara.ignore_hidden_elements = false
或添加:visible
您的方法的:visible
选项:
attach_file('photo_image', path_to_file, visible: false)
我更喜欢第二个变体,因为在大多数情况下,在测试中找到的元素是可见的,如果其中一个被隐藏,最好让Capybara抛出exception。
注意:大多数内部使用Capybara::Query
has_css?
方法也支持:visible
选项(如find
, all
, has_css?
, have_selector
等)
这里的要点是:dropzone仅使用输入字段作为标记或回退。 它从dom中删除它。 如果在成功执行dropzone初始化后检查页面源,您将无法再找到该元素。
所以它不是关于一个隐藏的输入字段,而是关于一个已删除的“已经消失”并且因为它不再是dom的一部分而无法找到。
我最终做的是在规范中手动添加输入字段:
page.execute_script(%|$('#your-form').append('');|)
这将使您的表单与dropzone回退模式一样。
由于我只是需要帮助某人解决这个问题,因此这是当前版本的Capybara和dropzone.js的更新答案。
默认情况下,Dropzone在初始化时使用“dz-hidden-input”类将隐藏文件字段添加到页面主体。 要为测试目的添加文件,您可以这样做
attach_file(file_path, class: 'dz-hidden-input', make_visible: true)
说明:没有已知的id / name / label文本,因此我们不传递定位符,而是传递class
选项以将找到的文件输入限制为具有指定类的文件。 然后我们指定make_visible: true
让make_visible: true
临时更改CSS,以便文件输入变得可见,添加文件,然后恢复原始CSS。
Dropzone.js使用下一个输入来附加文件(从我的网站上获取):
所以你需要的只是运行以下代码来通过dropzone.js附加文件:
page.find('.dz-hidden-input', visible: false).set('file_path_here'))
你可以用
it "should upload a file" do visit upload_file_path attach_file "uploadfile(id of field)", /path/to/file/to/upload click_button "Upload File" end
do … end之间的步骤应该适用于rspec +水豚或黄瓜+水豚
为什么不使用:js => true,它将有助于找到隐藏的元素太…
我认为Capybara没有找到是因为你没有创建文件字段。
type =“file”就是你想要的。 type =“hidden”的输入应该只接受一个字符串。
我也试图在rspec / capybara测试一个dropzone.js区域并撞墙。 你有没有想到这个?
我在这里尝试解决方案,没有运气: 使用Selenium模仿将文件拖到上传元素上
您不需要添加新页面执行,您需要做的就是找到.dz-hidden-input和attach_file …
attach_file("path/to/file", class: "dz-hidden-input", make_visible: true)
您的输入类型是隐藏的,请将其删除,因为水豚不能在浏览器上看到它。试试这个,它对我有用: –
web_steps.rb
When /^I attach the file "([^"]*)" to "([^"]*)"$/ do |path, field| attach_file(field, File.expand_path(path)) end
upload_picture.feature
###.....some other steps too When I attach the file "app/assets/images/default/accept.jpg" to "image[image]"