与 file_field inside span 交互 - Watir/Selenium-Webdriver
Interact with a file_field inside span - Watir/Selenium-Webdriver
如何与被 parent 隐藏的 file_field 互动?
<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>
按钮覆盖了输入,因此不可见。
编辑
作为记录,这是我的代码:
data[:photos].each do |photo|
$browser.file_field.set photo
end
和错误:Watir::Wait::TimeoutError: timed out after 20 seconds, waiting for {:tag_name=>"input", :type=>"file"} to become present
中的可行示例
对于我的情况,这行得通:
$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_field.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
如何与被 parent 隐藏的 file_field 互动?
<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>
按钮覆盖了输入,因此不可见。
编辑
作为记录,这是我的代码:
data[:photos].each do |photo|
$browser.file_field.set photo
end
和错误:Watir::Wait::TimeoutError: timed out after 20 seconds, waiting for {:tag_name=>"input", :type=>"file"} to become present
对于我的情况,这行得通:
$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_field.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