LoginSignup
18
9

More than 3 years have passed since last update.

Selenium WebDriverでHTTPステータスコードを確認したい

Last updated at Posted at 2019-12-09

この記事は 弁護士ドットコム Advent Calendar 2019 - Qiita の10日目の記事です。

はじめに

  • この記事で利用されているサンプルコードは こちら に公開しています。
    • 動作確認などにご利用ください。
  • 他の人のサーバに対して、むやみにプログラムを使ってアクセスしてはいけません。サンプルコードの取り扱いはご注意ください。

Selenium WebDriverを利用してHTTPステータスコードって取得できるの?

パフォーマンスログからの取得を試みる

  • いわゆる 開発者ツール で表示されるアレです。
  • ページ内で発生する通信の情報が記録されているため、そこからステータスコードの取得を試みます。

WebDriver側の設定

  • デフォルトだと、パフォーマンスログは取得されないので、設定を有効にする必要がある。
  • サンプルだと このへんです。
logging_prefs = {
  driver: 'ALL',
  server: 'OFF',
  browser: 'ALL',
  performance: 'ALL' # パフォーマンスログを有効に
}

caps = Selenium::WebDriver::Remote::Capabilities.new(
  browser_name: browser_name,
  javascript_enabled: true,
  css_selectors_enabled: true,
  takes_screenshot: true,
  native_events: true,
  proxy: nil,
  loggingPrefs: logging_prefs # ここで設定
)

パフォーマンスログの取得

  • WebDriverを利用してページアクセスを行なった際のパフォーマンスログを取得する。
    • WebDriverからログを取得すると、揮発してしまうようです。
    • 何度も利用する場合は、どこかに退避しておく必要があります。
  • サンプルだと このへん とか このへん になります。

  • パフォーマンスログは以下のようなイメージです。


{  
  "message":{  
    "method":"Network.responseReceived", // ログの要素
    "params":{
        /* methodごとに異なるフォーマット */
    }
  },
  "webview":"9B690C508A0F351BED47CA889794059B"
}
  • Network.responseReceived から、アドレスバーのURL(driver.current_url)に対する通信の記録を抽出します。
    • 記録されたレスポンスヘッダから、ステータスコードを取得することが可能です。
  def extract_status_code current_url, logs
    logs.each do |log|
      next if log[:method] != 'Network.responseReceived'

      params = log[:params] || {}
      response = params[:response] || {}
      next if response[:url] != current_url

      return response[:status].to_i
    end
    0
  end

パフォーマンスログからステータスコードが取得できないケース

  • History APIなどでアドレスバーのURLが書き換わっているケース。
    • driver.current_url のURLで通信が発生していないため、データの抽出ができません。
  • ホスト名が解決できないなど、対象のURLに対して通信が発生しないケース。
    • そもそもパフォーマンスログが積まれていません。
    • その場合の判定方法は こちら のようになります。
def check_unreachable? current_url, logs
  logs.each do |log|
    next if log[:method] != 'Page.frameNavigated'

    params = log[:params] || {}
    frame = params[:frame] || {}
    return true if frame[:unreachableUrl] == current_url
  end
  false
end

まとめ

  • パフォーマンスログを利用すれば、ある程度ステータスコードの取得は可能。
    • ただし、取得できないケースもあり、過信は禁物。
  • Puppeteerで代用可能であればそちらを利用した方が賢明。
18
9
0

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
18
9