возникли проблемы с использованием capybara-webkit attach_file загрузить изображение

Я хочу протестировать функцию добавления изображения в приложение. Как я могу это сделать. метод attach_file не работает. Я не знаю почему.

HTML:

<form id="edit_user_5577b0c4a851ac600c000002" class="form-horizontal user-settings" method="post" enctype="multipart/form-data" action="/tardis54" accept-charset="UTF-8">
    <div id="upload-avatar" class="control-group">
        ::before
        <label class="control-label" for="user_avatar">
            Setting avatar
        </label>
        <div class="controls">
            <div class="form-fileupload">
                <div class="image-preview">
                    <img class="gravatar img-circle" width="60" height="60" src="http://gravatar.com/avatar/7046a07b25397e4a0c838a47c88d8742?default=identicon&secure=false&size=60" data-retina-url="http://gravatar.com/avatar/7046a07b25397e4a0c838a47c88d8742?default=identicon&secure=false&size=120" alt="tardis54"></img>
                </div>
                <span class="btn btn-fileinput btn-default">
                    <span>
                        Choose file ...
                    </span>
                    <input id="user_avatar" class="input-file" type="file" name="user[avatar]"></input>
                </span>
            </div>
        </div>
   </div>
    <div class="form-actions pull-right">
        <input class="btn btn-large btn-primary" type="submit" value="Update" name="commit"></input>
    </div>
</form>

тестовый код:

scenario "upload a custom avatar" do
    attach_file("user[avatar]", Rails.root + "temp4.png")
end 

журнал ошибок:

Failure/Error: attach_file("user[avatar]", Rails.root + "temp4.png")
 Capybara::Webkit::ClickFailed:
   Failed to click element /html/body/div[@id='content']/div/div/div/div/div/div[2]/form[@id='edit_user_5580e19da851ac6a51000002']/div[@id='upload-avatar']/div/div/span/input[@id='user_avatar'] 
because of overlapping element /html/body/div[@id='content']/div/div/div/div/div at position 740, 627;

person tardis    schedule 17.06.2015    source источник
comment
находится ли поле ввода в раскрывающемся списке или отдельно в форме, как выглядит окружающий html? может быть более конкретным, но нужно увидеть больше html   -  person Richlewis    schedule 17.06.2015
comment
Я добавил больше html. Знаете ли вы, как решить эту проблему сейчас? @Ричльюис   -  person tardis    schedule 17.06.2015
comment
не могли бы вы вместо этого попробовать использовать id в качестве локатора и дайте мне знать, что произойдет   -  person Richlewis    schedule 17.06.2015
comment
Я использую attach_file("user_avatar", Rails.root + "temp4.png") . Получите ту же ошибку, что и раньше.   -  person tardis    schedule 17.06.2015
comment
разве это не attach_file("#user_avatar", Rails.root + "temp4.png")   -  person Richlewis    schedule 17.06.2015
comment
ой, простите. Когда я использую attach_file("#user_avatar", Rails.root + "temp4.png"). Я получаю сообщение об ошибке: Capybara::ElementNotFound: Unable to find file field "#user_avatar"   -  person tardis    schedule 17.06.2015
comment
возможно, вам нужно интерполировать путь к файлу, поэтому "#{Rails.root}/path/to/image"   -  person Richlewis    schedule 17.06.2015
comment
Это не работает. Путь к изображению правильный. @Ричльюис   -  person tardis    schedule 17.06.2015


Ответы (4)


Похоже, вы используете CSS для наложения другого элемента поверх ввода HTML. Некоторые люди делают это, потому что напрямую стилизовать входные данные HTML-файла сложно. Однако это ломает capybara-webkit, потому что ему нужно щелкнуть по фактическому полю ввода HTML, а стилизованный элемент располагается поверх него.

Это обсуждается в проблеме GitHub.

Вы можете обойти это в тесте, используя execute_script, чтобы скрыть элемент наложения, а затем попытаться загрузить файл.

person Joe Ferris    schedule 17.06.2015

Я нахожу способ решить эту проблему.

script = "$('#user_avatar').css({opacity: 100, display: 'block', position: 'relative', left: ''});" page.execute_script(script)

person tardis    schedule 18.06.2015

Я мог бы предположить, что input[type=file] не виден, поэтому вам нужно изначально сделать его видимым, т.е. выполнить javascript $("input[type=file]").show() и затем прикрепить файл

person dmr    schedule 17.06.2015

Вот моя реализация ответа @tardis (которая сама по себе является реализацией предложения @joe-ferris). Я поставил это как ответ, чтобы иметь возможность использовать форматирование кода.

# spec/support/file_uploads.rb
module FileUploads
  # Enables file uploads by capybara-webkit on pages that 
  # style file their input fields
  def attach_file_styled_input(element_id, file)
    page.execute_script("$('##{element_id}')" +
      ".css({opacity: 100, display: 'block', position: 'relative', left: ''});")
    attach_file element_id, file
  end
end

Не забудьте включить этот модуль поддержки в spec/rails_helper.rb:

config.include FileUploads

Затем используйте его в своей спецификации функции следующим образом (не эффектно):

attach_file_styled_input 'my_input_id', 'my_file'
person bovender    schedule 16.01.2016