2015-05-28 3 views
1

Как мне взаимодействовать с файловым полем, скрытым его родителем?Взаимодействие с файловым полем внутри диапазона - Watir/Selenium-Webdriver

<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

Работающий пример в Gist

+0

Хм. Использование HTML внутри '' tags Я смог успешно выполнить 'browser.file_field.set '/ path/to/file''. Может быть, страница не загружена полностью? Возможно, попробуйте 'browser.file_field (: id, 'gallery_files'). Wait_until_present' перед тем, как выбрать файл с фотографией? Не уверен, что еще может вызвать проблему для вас. – pjd

+0

Это стилизованная кнопка сверху ввода. Таким образом, сам вход не отображается. – TIMBERings

+0

Это может помочь, если вы разделите CSS, который вы используете, чтобы создать диапазон/вход.Имея пример, который позволяет нам воспроизвести ошибку, мы отвечаем на правильный вопрос. –

ответ

2

Я был немного удивлён, но я был в состоянии установить поле файла в образце 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 
0

Для моей ситуации это работал:

 $browser.execute_script("jQuery(function($) { 
           $('.fileinput-button').css('visibility', 'hidden') 
           $('#gallery_files').css('visibility', 'visible').css('opacity', '1').css('width', '100').css('height', '50') 
          })") 

Я должен был скрыть родительский интервал, а затем показать, изменить размер и изменить непрозрачность ввода

Смежные вопросы