重构capybara javascript dropzone测试

时间:2016-10-17 01:34:13

标签: javascript ruby-on-rails rspec capybara

我试图多次调用dropzone capybara测试。但是,当我第二次调用它时,ID已被使用。我正在尝试将ID随机化,以便它可以运行多次。

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

第二次调用时出错。

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

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

1 个答案:

答案 0 :(得分:0)

您绝对可以为输入生成一个随机ID号,但如果不存在则只创建fakeFileInput它可能更容易。这只有在您不将输入用于此方法之外的任何其他目的时才有效,但看起来这就是您正在做的事情。

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

如果它确实存在,它将不会再次创建,它只会被重用。