この記事は 弁護士ドットコム Advent Calendar 2019 - Qiita の10日目の記事です。
はじめに
- この記事で利用されているサンプルコードは こちら に公開しています。
- 動作確認などにご利用ください。
- 他の人のサーバに対して、むやみにプログラムを使ってアクセスしてはいけません。サンプルコードの取り扱いはご注意ください。
Selenium WebDriverを利用してHTTPステータスコードって取得できるの?
- どうやらできないらしいです。
- また、方針としてそのような機能を作成することはなさそうです。
- ユーザアクションのエミュレートではないのでスコープ外だよ!
- ステータス確認したければ、普通のHttpClientで確認した方が良いよ!
- Proxyサーバを前に立てて、そこでステータスを確認したら良いよ!
- ちなみにPuppeteerならできそうです。
パフォーマンスログからの取得を試みる
- いわゆる
開発者ツール
で表示されるアレです。 - ページ内で発生する通信の情報が記録されているため、そこからステータスコードの取得を試みます。
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で代用可能であればそちらを利用した方が賢明。