Ruby 与span-Watir/Selenium Webdriver中的文件字段交互
如何与父项隐藏的文件\ U字段交互Ruby 与span-Watir/Selenium Webdriver中的文件字段交互,ruby,selenium-webdriver,watir-webdriver,Ruby,Selenium Webdriver,Watir Webdriver,如何与父项隐藏的文件\ U字段交互 <span class="btn button-large fileinput-button"> Select files... <input accept="image/png, image/gif, image/jpeg" id="gallery_files" multiple="multiple" name="gallery_files" type="file"> </span> 错误:Watir::
<span class="btn button-large fileinput-button">
Select files...
<input accept="image/png, image/gif, image/jpeg" id="gallery_files" multiple="multiple" name="gallery_files" type="file">
</span>
错误:Watir::Wait::TimeoutError:20秒后超时,等待{:tag_name=>“input”,:type=>“file”}出现
在一个可行的例子中对于我的情况,这是有效的:
$browser.execute_script("jQuery(function($) {
$('.fileinput-button').css('visibility', 'hidden')
$('#gallery_files').css('visibility', 'visible').css('opacity', '1').css('width', '100').css('height', '50')
})")
我不得不隐藏父跨距,然后显示、调整大小和更改输入的不透明度。我有点惊讶,但我能够使用以下命令在示例HTML中设置文件字段,而没有任何问题:
browser.file_field.set('path/to/file.txt')
从代码来看,设置文件字段似乎只需要输入存在。它不要求它是可见的(或存在的)
假设您得到了一个Watir::Wait::TimeoutError
异常,我猜您的代码在file\u字段.set
之前实际上失败了。由于页面似乎在对话框中有输入,我猜您的代码实际上更像:
$browser.file_field.wait_until_present
data[:photos].each do |photo|
$browser.file_field.set photo
end
实际上抛出异常的是wait_-until_-present
方法
解决方案1
假设正在为文件字段调用显式等待方法,您应该能够删除等待
如果由于Ajax正在加载对话框而导致等待,则可以尝试等待其他元素,例如父范围
解决方案2
如果出于某种原因需要显示文件字段,则需要更改其CSS。在这种情况下,不透明度:
p $browser.file_field.present?
#=> false
$browser.execute_script('arguments[0].style.opacity = "1.0";', browser.file_field)
p $browser.file_field.present?
#=> true
嗯。在
标记中使用HTML,我能够成功地执行browser.file\u field.set'/path/to/file'
。可能是页面没有完全加载吗?可以尝试browser.file\u字段(:id,'gallery\u files')。在尝试选择照片文件之前,请等待\u出现?不确定还有什么可能会导致您出现问题。这是输入顶部的一个样式化按钮。因此,输入本身是不可见的。如果您共享用于设置span/input样式的CSS,可能会有所帮助。有一个允许我们重现错误的示例可以确保我们回答了正确的问题。添加了一个示例作为编辑。
p $browser.file_field.present?
#=> false
$browser.execute_script('arguments[0].style.opacity = "1.0";', browser.file_field)
p $browser.file_field.present?
#=> true