如何使用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选项(如findallhas_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: truemake_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]"