Ruby 与span-Watir/Selenium Webdriver中的文件字段交互

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

如何与父项隐藏的文件\ 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::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