我希望将文件添加到<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
我看不到任何隐藏的块,它的超级范围。有什么想法吗?
答案 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_file
或set
。例如,如果您的网站使用隐藏文件元素的不透明方法,您可以执行类似
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脚本中找到该元素,然后修改其不透明度。