Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby: Phantom.js blocked on specific site?

I am using capybara poltergeist to automate a small script on tumblr.com

My script works fine with my chrome driver.. And my poltergeist driver loads all other websites just fine, but for some reason throws a Capybara::Poltergeist::StatusFailError when I try to load tumblr.

Steps for reproduction:

$ 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?

I tried to set all of my headers to look my google chrome's request, but that also does not seem to fix it. Does anyone have any suggestions?

like image 930
BananaNeil Avatar asked Sep 07 '14 02:09

BananaNeil


1 Answers

The problem is related to phantomjs SSL handshake fail. You can take my gist and run with phantomjs, you will see:

[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")

Checking a little bit a workaround is to use --ssl-protocol=any in phantom, so your code will become:

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

To work.

References:

  • debugging phantom js page
  • ssl-protocol-any
like image 94
Enrico Carlesso Avatar answered Oct 24 '22 08:10

Enrico Carlesso