Руби: Phantom.js заблокирован на определенном сайте?

Я использую полтергейст водосвинки для автоматизации небольшого скрипта на tumblr.com.

Мой скрипт отлично работает с моим драйвером Chrome. И мой драйвер полтергейста отлично загружает все другие веб-сайты, но по какой-то причине выдает Capybara::Poltergeist::StatusFailError, когда я пытаюсь загрузить tumblr.

Этапы размножения:

$ brew install phantomjs
$ gem install capybara
$ gem install poltergeist
$ gem install selenium-webdriver
$ irb


require 'capybara/poltergeist'

module Drivers
  class Poltergeist < Capybara::Poltergeist::Driver
    def needs_server?
      false
    end
  end
end

Capybara.register_driver :poltergeist_errorless do |app|
  Drivers::Poltergeist.new(app, js_errors: false, timeout: 10000, phantomjs_options: ['--load-images=no', '--ignore-ssl-errors=yes'])
end

session = Capybara::Session.new(:poltergeist_errorless)
session.visit('https://google.com') # This works fine
session.visit('https://tumblr.com') # This does not work?

Я попытался настроить все свои заголовки так, чтобы они отображали запрос моего Google Chrome, но это также не помогло. У кого-нибудь есть предложения?


person BananaNeil    schedule 07.09.2014    source источник
comment
Тупик. Довольно сложно отлаживать полтергейст, но я не могу понять, почему посещение tumblr приводит к ошибке {'status' => 'fail' }. Отлично работает в селене...   -  person Anthony    schedule 16.09.2014
comment
Спасибо за внимание, я очень ценю ваше время. Я не могу понять, почему это так сложно решить?   -  person BananaNeil    schedule 16.09.2014


Ответы (1)


Проблема связана с ошибкой рукопожатия phantomjs SSL. Вы можете взять мой суть и запустить с phantomjs, вы увидите:

[cut]
= onResourceError()
  - unable to load url: "https://www.tumblr.com/"
  - error code: 6, description: SSL handshake failed
= onResourceReceived()
  id: 3, stage: "end", response: {"contentType":null,"headers":[],"id":3,"redirectURL":null,"stage":"end","status":null,"statusText":null,"time":"2014-09-16T12:06:05.547Z","url":"https://www.tumblr.com/"}
= onLoadFinished()
  status: fail
DONE WITH  fail WebPage(name = "WebPage")

Немного проверки обходного пути - использовать --ssl-protocol=any в фантоме, поэтому ваш код станет:

Capybara.register_driver :poltergeist_errorless do |app|
  Drivers::Poltergeist.new(app, js_errors: false, timeout: 10000, phantomjs_options: ['--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=any'])
end

Работать.

Рекомендации:

person Enrico Carlesso    schedule 16.09.2014
comment
Спасибо за это Энрико! - person etusm; 24.04.2015
comment
Я все еще сталкиваюсь с этой проблемой на своем ноутбуке, но на производстве. Это случайный сбой. - person Chamnap; 18.07.2015
comment
@Chamnap, что вы подразумеваете под производством? Вы инициализировали Полтергейст параметрами --ignore-ssl-errors=yes и --ssl-protocol=any? - person Enrico Carlesso; 18.07.2015
comment
Я имею в виду, что это случайный сбой. Иногда работаю на моем ноутбуке, но не на производстве и наоборот. Да, я уже инициализировал эти параметры, а также проверил с помощью ps aux | grep phantomjs. Также есть проблема с полтергейстом, github.com/EFForg/phantom- of-the-capitol/issues/47. - person Chamnap; 18.07.2015