如何将phantomjs uploadFile与Capybara和poltergeist一起使用?

时间:2015-03-16 07:48:26

标签: capybara phantomjs poltergeist

我正在尝试在我的规范中附加一个文件,但是capybara attach_file方法在poltergeist中对我不起作用(它返回true但没有附加任何内容)。它在Selenium中有效,但由于其他原因,我想使用poltergeist。我知道phantomjs uploadFile方法(http://phantomjs.org/api/webpage/method/upload-file.html)模拟用户与文件对话框交互,这是我认为我需要做的。我在Capybara规范中无法弄清楚如何使用它。

我正在尝试使用

def drop_files(files, css_selector)
  js_script = 'fileList = Array(); '
  files.count.times do |index|
    # Generate a fake input selector
    page.execute_script("if ($('#seleniumUpload#{index}').length == 0) { " \
                        "seleniumUpload#{index} = window.$('<input/>')" \
                        ".attr({id: 'seleniumUpload#{index}', type:'file'})" \
                        ".appendTo('body'); }")

    # Attach file to the fake input selector through Capybara
    attach_file("seleniumUpload#{index}", files[index], visible: false)
    # Build up the fake js event
    #
    js_script << "fileList.push(seleniumUpload#{index}.get(0).files[0]); "
  end

  js_script << "e = $.Event('drop'); "
  js_script << "e.dataTransfer = { files : fileList }; "
  js_script << "$('#{css_selector}').trigger(e);"

  # Trigger the fake drop event
  page.execute_script(js_script)
end

来自https://github.com/teampoltergeist/poltergeist/issues/342并在selenium中工作。发布的用户表示他让它在恶作剧中工作。

1 个答案:

答案 0 :(得分:1)

事实证明,文件上传目前已在Phantomjs 2.0上打破。我降级了v1.9.8并且attach_file现在正常工作。