Ruby on rails 水豚、水豚网络工具包和自定义文件上传表单
我使用以下html堆栈创建了自定义上载表单:Ruby on rails 水豚、水豚网络工具包和自定义文件上传表单,ruby-on-rails,capybara,capybara-webkit,poltergeist,Ruby On Rails,Capybara,Capybara Webkit,Poltergeist,我使用以下html堆栈创建了自定义上载表单: <form> <label></label> <input type="file"> </form> 或 还有很多其他的。在所有的时间里,我都会遇到“单击未知位置的元素失败”错误。删除与输入字段重叠的标签后,使其可见并运行我的规范,所有内容都通过。因此,这里的问题是: 输入文件字段具有display:none属性(因此无法找到) 有一个标签与隐藏的文件字段重叠(可能) 有没有办法让
<form>
<label></label>
<input type="file">
</form>
或
还有很多其他的。在所有的时间里,我都会遇到“单击未知位置的元素失败”错误。删除与输入字段重叠的标签后,使其可见并运行我的规范,所有内容都通过。因此,这里的问题是:
display:none
属性(因此无法找到)有没有办法让Capybara with Capybara webkit驱动程序以某种理智的方式处理这种微妙的情况?有了Capybara webkit,您可以告诉驱动程序在页面上下文中运行您想要的任何javascript,这样您就可以编写一些自定义代码来解决可见性问题:
script = "$('thelabel').toggle(); " # hide the label
script << "$('myfield').toggle();" # show your field
page.driver.browser.execute_script(script)
这个较短的版本应该适用于2.x和最新版本的or,这是我现在使用的一个依赖性较低的替代方案
还有一种合作伙伴方法,evaluate\u script
:
result = page.evaluate_script('4 + 4');
希望这有帮助 对于其他人,您可能会发现这一点很有用: 有时“切换”是不够的,然后选中“不透明度”(不应为零):
Matt Sanders建议使用JS切换元素的可见性。这会管用的,但在我看来,还有另一个更干净的解决方案 我建议仅在必要时才包含隐藏字段。为了做到这一点,我 当您实际希望水豚包括时,请将此帮助程序用于罕见的情况 隐藏字段。例如:
# features/support/capybara_helpers.rb
module CapybaraHelpers
# By default, capybara will ignore all hidden fields. This is a smart default
# except in rare cases. For example, our AS3 file uploader requires you to
# click a hidden file field - and that makes perfect sense. In those rare
# cases, you can use this helper to override the default and force capybara
# to include hidden fields.
#
# Examples
#
# include_hidden_fields do
# attach_file("hidden-input", "path/to/fixture/file")
# end
#
def include_hidden_fields
Capybara.ignore_hidden_elements = false
yield
Capybara.ignore_hidden_elements = true
end
end
World(CapybaraHelpers)
试试这个
file_field=page.find('input[type=“file”]”,可见:false)
file_field.set('path/to/my/image.jpg'))
现在有一个选项“使您可见”
你能用CSS/JS显示你的标签样式吗?我可以复制这个问题吗?这真的不是什么花哨的东西,只是普通的东西-(顺便说一句,这是自定义文件上传字段的一个干净完整的解决方案:-)如果你不能在Selenium中将文件附加到不可见的输入-请参阅。我认为您应该在将文件附加到文件之前使文件输入可见。好的是,我没有使用Selenium。我不确定这里发生了什么,但我注意到两件事:(1)您没有关闭输入标记。不知道这对水豚是否重要。(2) 在JSFIDLE中,当我单击标签时(在Firefox22.0中),文件对话框会打开两次。在我单击第一个对话框上的“取消”后,第二个对话框打开。最后,一个答案!非常感谢你-你刚刚救了我的测试!是的,当然这个解决方案有点不干净,但它是有效的,而且这个解决方案保持了我的生产代码的干净;这比干净的测试代码更重要。同意,在测试方面牺牲更好。很乐意帮忙!:-)不在现场的问题被隐藏;该问题的存在是因为表单字段被标签覆盖。所以没有;在这种情况下,您的解决方案不起作用。
page.execute_script(script)
result = page.evaluate_script('4 + 4');
script = "$('#file-field').css({opacity: 100, display: 'block'});"
page.driver.browser.execute_script(script)
# features/support/capybara_helpers.rb
module CapybaraHelpers
# By default, capybara will ignore all hidden fields. This is a smart default
# except in rare cases. For example, our AS3 file uploader requires you to
# click a hidden file field - and that makes perfect sense. In those rare
# cases, you can use this helper to override the default and force capybara
# to include hidden fields.
#
# Examples
#
# include_hidden_fields do
# attach_file("hidden-input", "path/to/fixture/file")
# end
#
def include_hidden_fields
Capybara.ignore_hidden_elements = false
yield
Capybara.ignore_hidden_elements = true
end
end
World(CapybaraHelpers)