Капибара, полтергейст и фантомы и пустой отклик в теле

Я получаю пустой документ от phantomjs. Я пытаюсь использовать Capybara и Poltergeist для настройки драйвера phantomjs для Capybara.

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

require 'capybara/poltergeist'

  module Parser
    module JSParser
      include Capybara

      # Create a new PhantomJS session in Capybara
      def new_session
        # Register PhantomJS (aka poltergeist) as the driver to use
        Capybara.register_driver :poltergeist do |app|
          Capybara::Poltergeist::Driver.new(app, :debug => true)
        end

        # Use XPath as the default selector for the find method
        Capybara.default_selector = :xpath
        Capybara.javascript_driver = :poltergeist
        Capybara.current_driver = :poltergeist
        # Start up a new thread
        @session = Capybara::Session.new(:poltergeist)

        # Report using a particular user agent
        @session.driver.headers = { 'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X)' }

        # Return the driver's session
        @session
      end

      # Returns the current session's page
      def html
        @session.html
      end

    end
  end

Затем загрузите страницу следующим образом:

class Loader
  include Parser::JSParser

  def load_page
    new_session
    visit "http://www.smashingmagazine.com"
    #let phantomjs take its time
    sleep 5
    puts "html=#{html}"  
  end
end

Затем, наконец, вызов load_page

Loader.new.load_page

Вот ответ отладки от полтергейста

poltergeist [1364758785355] state default -> loading
{"response"=>true}
{"name"=>"visit", "args"=>["http://www.smashingmagazine.com"]}
poltergeist [1364758794574] state loading -> default
{"response"=>{"status"=>"success"}}
{"name"=>"body", "args"=>[]}
{"response"=>"<html><head></head><body></body></html>"}

Как видите, ответ — это просто пустой документ, содержащий только теги html, head и body, но ничего в теге body.

Что я делаю не так? Наблюдая за сетевым трафиком, я получаю полный ответ от хоста (в данном случае smashingmagazine.com). После того, как ответ возвращается, я не знаю, что происходит. Иногда phantomjs также дает сбой, а в других случаях он проходит с пустым телом. Вот последняя строка, которая печатается в STDERR при сбое phantomjs

PhantomJS client died while processing {"name":"visit","args":["http://www.smashingmagazine.com"]}

person sat    schedule 31.03.2013    source источник


Ответы (3)


У меня также была аналогичная проблема. Но приведенная ниже настройка параметра :phantomjs_options помогла мне решить проблему.

  Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app,
                                      :phantomjs_options => ['--debug=no', '--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=TLSv1'], :debug => false)
  end
person Arup Rakshit    schedule 11.11.2014
comment
Спасибо за это. Аргумент '--ssl-protocol=TLSv1' решил для меня аналогичную проблему с пустым ответом. - person Kirkman14; 27.01.2015
comment
После нескольких часов отладки редко используемой функции, основанной на casper.js и phantomjs, я наткнулся на этот ответ. Несколько месяцев назад мы повысили безопасность нашего обратного прокси-сервера….facepalm. Я не могу поверить, что phantomjs просто молча терпит неудачу, когда это происходит. Спасибо!!! - person AlexMA; 30.01.2015
comment
Я рвал на себе волосы последние 8 часов, большое спасибо за эти варианты, которые спасли мой день. ваше здоровье ! - person Sephy; 05.05.2015

Это звучит как ошибка в PhantomJS при посещении этого сайта. Я предлагаю попробовать загрузить веб-сайт, используя только PhantomJS (не Poltergeist или Capybara), чтобы проверить, работает ли это. Если у него также есть проблемы, сообщите об ошибке в PhantomJS.

Вы можете прочитать о PhantomJS здесь: https://github.com/ariya/phantomjs/wiki/Quick-Start

person jonleighton    schedule 02.04.2013

Получите html вместо этого puts "html=#{page.html}"

person user471245    schedule 20.04.2013