Using poltergeist with a proxy?

2019-02-19 03:19发布

问题:

I'm using PhantomJS and poltergeist to emulate a browser, however I'm not sure how to specify a proxy to use in the code:

require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'

task :experiment => :environment do
  Capybara.run_server = false
  Capybara.current_driver = :poltergeist
  Capybara.app_host = "http://something.com"
  include Capybara::DSL

  # set_proxy('12.13.14.15', '4521')

  visit('posts')
  page.include?('foo')
end

Also, for some reason, i get undefined method page when using poltergeist, can anyone advise?

回答1:

You need to pass the --proxy option to PhantomJS, see the API docs

With Poltergeist, you can use the :phantomjs_options configuration option to specify command line options for PhantomJS.

Putting it together:

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, phantomjs_options: ["--proxy=12.13.14.15:4521"])
end


回答2:

Try to run it in controller action, so when it will control through controller level it will update the new proxy ip. Like this way

def index
    options = {
       :js_errors => false,
       :debug => true,
       :phantomjs => "/Users/Umer/Desktop/phantomjs-2.0.0-macosx/bin/phantomjs",
       #:phantomjs_options => ["--proxy=#{proxy.ip}:#{proxy.port}", "--proxy-auth=#{proxy.username}:#{proxy.password}"]
       :phantomjs_options => ["--proxy=88.150.136.178:3128"]
    }
    Capybara.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new(app, options)
    end
    Capybara.default_driver = :poltergeist
    Capybara.javascript_driver = :poltergeist
    Capybara.default_wait_time = 20
    Capybara.ignore_hidden_elements = true
    Capybara.run_server = false
    Capybara.app_host = 'http://mxtoolbox.com'


    session = Capybara::Session.new(:poltergeist)

    session.visit('/WhatIsMyIP/')

    file = File.new("test3.html", "w+")
    file.write(session.body)
    file.close

    session.driver.quit
end