рефакторинг capybara javascript dropzone test

#javascript #ruby-on-rails #rspec #capybara

#javascript #ruby-on-rails #rspec #capybara

Вопрос:

Я пытаюсь вызвать тест dropzone capybara несколько раз. Однако, когда я вызываю его во второй раз, идентификатор уже был использован. Я пытаюсь рандомизировать идентификатор, чтобы он мог выполняться несколько раз.

 def drop_in_dropzone(file_path)
  page.execute_script <<-JS
    fakeFileInput = window.$('<input/>').attr(
      {id: 'fakeFileInput', type:'file'}
    ).appendTo('body');
  JS
  attach_file("fakeFileInput", file_path)
  page.execute_script("var fileList = [fakeFileInput.get(0).files[0]]")
  page.execute_script <<-JS
    var e = jQuery.Event('drop', { dataTransfer : { files : [fakeFileInput.get(0).files[0]] } });
    $('.dropzone')[0].dropzone.listeners[0].events.drop(e);
  JS
end
 

Ошибка при вызове 2-го раза.

 Failure/Error: attach_file("fakeFileInput", file_path)

Capybara::Ambiguous:
Ambiguous match, found 2 elements matching file field "fakeFileInput"
 

Ответ №1:

Вы определенно можете просто сгенерировать случайный идентификационный номер для ввода, но, возможно, было бы проще просто создать fakeFileInput, если он еще не существует. Это будет работать только в том случае, если вы не используете входные данные для каких-либо других целей, кроме как в этом методе, но, похоже, это то, что вы делаете.

 page.execute_script <<-JS
  fakeFileInput = fakeFileInput || window.$('<input/>').attr(
    {id: '#{fake_input_id}', type:'file'}
  ).appendTo('body');
JS
 

Если бы он уже существовал, он не создавался бы снова, а просто использовался бы повторно.