文件类型输入有什么特别的东西使它无法找到?

时间:2016-12-21 21:54:18

标签: ruby selenium capybara

我希望将文件添加到<input type="file">

这是html的片段

 <span class="btn btn-xs btn-primary btn-file"> #found
    <span class="blahicon blahicon-upload"></span>
    Browse
    <input type="file" data-bind="value: fileName, event: { change: uploadImagesOnChange }"
    accept="blah/txt" multiple=""> #not found
 </span>

这里是水豚和红宝石

 within_frame('frame1') do
   within_frame('frame2') do
     within(:xpath, [containing span xpath]) do  # finds this
       find(:xpath, './/*[@type="file"]').send_keys('C:\Users\...\blah.txt') #ElementNotFound
     end
   end
 end

我看不到任何隐藏的块,它的超级范围。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以直接检查输入的xpath,而不是使用within(:xpath, [containing span xpath]),而不是has_xpath?(".//span[contains(text(),'Browse')]/input") 如果它返回true,那么尝试使用 find(:xpath, ".//span[contains(text(),'Browse')]/input").send_keys ('C:\Users\...\blah.txt')

如果您了解'pry'gem,那么您可以通过尝试各种xpath组合而不是仅运行整个脚本来调试此事,这样您就可以了解实际问题。

答案 1 :(得分:0)

我认为你的xpath有错误

.//*[@type='file']

更改为

//input[@type='file']

因为浏览器可以使用双引号(“”)检测属性值,但在脚本内部,您需要在单引号中使用它('')

也可以使您的XPath的不同组合像

{{1}}

答案 2 :(得分:0)

根据包装类上的类btn-file来判断,您可能正在使用Bootstrap和一种“标准”方法来隐藏实际的文件输入元素,以便它可以在多个浏览器中保持相同的样式。隐藏按钮的方法有多种,只需将display:none设置为更加“现代”的方法,将其扩展到与替换按钮相同的大小,并将其不透明度设置为0,使其成为透明覆盖层。替换。

在Capybara中处理此类设置的基本策略是使用execute_script首先使元素可见,然后照常使用attach_fileset。例如,如果您的网站使用隐藏文件元素的不透明方法,您可以执行类似

的操作
within_frame('frame1') do
  within_frame('frame2') do
    within(:xpath, [containing span xpath]) do  # finds this
      file_input = find(:file, visible: :all)
      page.driver.browser.execute_script("$(arguments[0]).css('opacity',1)", file_input.native)          
      file_input.set('C:\Users\...\blah.txt')
    end
  end
end

注意 - 此代码假设您在页面中使用jQuery,并且只能使用selenium驱动程序,因为它使用seleniums驱动程序特定的功能将元素从capybara传递到execute_script调用中的selenium。如果不使用jQuery,JS将需要更改,如果使用其他驱动程序,则需要使用DOM方法在JS脚本中找到该元素,然后修改其不透明度。