LoginSignup
3
2

More than 5 years have passed since last update.

[クローラー] Capybara Tips

Last updated at Posted at 2017-02-23

poltergeistの設定

Capybara.configure do |config|
  config.run_server = false
  config.current_driver = :poltergeist
  config.javascript_driver = :poltergeist
  config.default_max_wait_time = 10
end

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {
    timeout: 10,
    js_errors: false,
    phantomjs_options: ['--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=any'],
  })
end

Capybara::Sessionのラッパークラスを作る

class BaseBrowser
  attr_reader :session
  def initialize(url, options = {})
    @session = Capybara::Session.new(:poltergeist)

    @session.visit(url)
  end
end

デフォルト言語設定を日本語にする

session.driver.headers = {
  'Accept-Language' => 'ja'
}

ja と ja-JPだとjaのが良さそう
http://memorva.jp/internet/pc/browser_language.php

iphoneやMacでアクセスする

Mac

session.driver.headers = {
  "User-Agent" => "Mac Safari"
}

iphone

session.driver.headers = {
  "User-Agent" => 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 Safari/7534.48.3'
}

非表示のテキストを取得する

session.find('css_class', visible: false).text(:all)
session.all('css_class', visible: false).map { |tag| tag.text(:all) }

visible: false
textにallを渡す

ajaxの待機メソッド(Capybara.default_max_wait_time = 10であれば内部で10秒待ってくれる)

def wait_for_ajax(loading_element)
  session.has_css?(loading_element)
end

poltergeistをkill

def finish
  session.driver.quit
  @session = nil
end

これをしないとバッチのループなどでsessionを立ち上げ続けてるとpoltergeistが死なずにメモリが膨れる。なので実行終了時や例外時で抜ける時などに必ずfinishを呼び出す。

3
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2