Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 水豚、水豚网络工具包和自定义文件上传表单_Ruby On Rails_Capybara_Capybara Webkit_Poltergeist - Fatal编程技术网

Ruby on rails 水豚、水豚网络工具包和自定义文件上传表单

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属性(因此无法找到) 有一个标签与隐藏的文件字段重叠(可能) 有没有办法让

我使用以下html堆栈创建了自定义上载表单:

<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)