Ruby: Phantom.js заблокирован на определенном сайте?
Я использую capybara poltergeist для автоматизации небольшого script на tumblr.com
My script отлично работает с моим драйвером 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, но это также, похоже, не исправляет его. У кого-нибудь есть предложения?
Ответы
Ответ 1
Проблема связана с отказом SSL-аутентификации phantomjs SSL. Вы можете взять gist и запустить с помощью 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
в phantom, поэтому ваш код станет следующим:
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
Чтобы работать.
Литература: