Capybara 有可能与水豚的隐藏元素相互作用吗?

Capybara 有可能与水豚的隐藏元素相互作用吗?,capybara,attachment,Capybara,Attachment,我有一个文件字段,不透明度为0,与一个假按钮重叠。这是一种常见的css技术,伪造一种“上传按钮”,在不同的浏览器中一致显示 Capybara不允许我对该输入调用attach\u file。错误是Selenium::WebDriver::error::ElementNotVisibleError:元素当前不可见,因此可能无法与之交互 有人知道强迫水豚与无形元素相互作用的方法吗 答案仍然没有答案,但我已经找到了解决办法。没有什么智能,只是用一个简单的脚本使元素可见 page.execute_sc

我有一个文件字段,不透明度为0,与一个假按钮重叠。这是一种常见的css技术,伪造一种“上传按钮”,在不同的浏览器中一致显示

Capybara不允许我对该输入调用
attach\u file
。错误是Selenium::WebDriver::error::ElementNotVisibleError:元素当前不可见,因此可能无法与之交互

有人知道强迫水豚与无形元素相互作用的方法吗

答案仍然没有答案,但我已经找到了解决办法。没有什么智能,只是用一个简单的脚本使元素可见

  page.execute_script %Q{
    $('#photos').css({opacity: 1, transform: 'none'});
  }

我发布它以作记录。

您可以使用Capybara中的
visible:false
属性与隐藏元素交互

如果要单击隐藏元素,请使用:

find("#photos", visible: false).click

不要直接使用
点击按钮(“#照片”)

Miquel,谢谢您的帮助

在SeleniumWebDriver 2.35和Firefox24的C#绑定上与隐藏文件输入交互时,我也遇到了类似的问题。要使文件选择正常工作,请执行类似的操作:

((IJavaScriptExecutor)webdriver).ExecuteScript("$('#fileUploadInput').css({opacity: 1, transform: 'none'});");

IWebElement e = webdriver.FindElement(By.CssSelector("input#fileUploadInput")));

e.SendKeys("c:\\temp\\inputfile.txt");

我最终以另一种方式解决了它

execute\u script()

我已经有了一个合适的javascript文件。我附加了以下内容

<% if ENV["RAILS_ENV"] == "test" %>
  $('#photos').show()
<% end %>

$(“#照片”).show()
我还必须将
.erb
附加到我的javascript文件中,以便正确处理Rails资产

在我的测试文件中,我已经设置了
ENV[“RAILS\u ENV”]=“test”

通过这种方式,我可以在测试时使UI静音,同时保持产品的外观。

在需要查看不可见元素之前,然后重置它:

Capybara.ignore_hidden_elements = false
click_button 'my invisible button'
Capybara.ignore_hidden_elements = true

我用CSS样式
display:none设置:

page.execute_script("$('.all-hidden-elements').show();");
all('.all-hidden-elements').first.click

如果隐藏元素嵌套在可见父元素中(例如,可见标签中的隐藏输入),则可以单击父元素。如果仍要按ID查找输入,可以遍历到父级,如下所示:

find('#hidden_input').find(:xpath, '..').click

一般来说,在使用Capybara时,不可能与不可见元素进行交互(在大多数查找程序中,您可以使用
可见:false/hidden
选项找到它们,但实际上对它们不做任何操作)。但是,文件输入是一种特殊情况,因为隐藏元素非常常见,而且由于安全限制,没有其他方法通过与页面可见元素交互来实际添加文件。因此,
attach_file
有一个
make_visible
选项,可用于让水豚使元素可见,附加文件,然后将CSS重置为原始设置

attach_file('photos', file_path, make_visible: true)

这可能很难做到。试着从JS开始。但它可能不会在所有情况下都起作用,而且像您这样的浏览器可能没有使用capybara webkit(因为错误消息中的“Selenium::WebDriver::Error”),所以我从您的问题中删除了capybara webkit标记。这里可能已经回答了:解决方法很好!谢谢当你读到它的时候,他只是建议你把它作为解决某个问题的方法。一般来说,这不是一个好的解决方案,因为特定的测试不应该改变这样的全局选项。见@mc。在要单击的元素上,将结构粘贴到此处这可能只起作用,因为该元素具有不透明度:0而不是可见性:隐藏(或类似)。您不能直接单击隐藏元素@Thomas Walpole(此处:)的答案对于将文件附加到不可见文件输入的问题是一个更有用、更直接的答案。另外请注意,
find(“#photos”,visible:false)
也将匹配可见的#photos。如果只想匹配不可见元素,则需要
find(#photos),visible::hidden)
,如Thomas Walpole所述