LoginSignup
7
7

More than 3 years have passed since last update.

Selenium Webdriver + Chrome DevTools Protocolを使って情報を取得してみる

Last updated at Posted at 2021-02-24

はじめに 〜この記事でご紹介すること〜

本記事では「 Selenium Webdriver Chrome DevTools Protocol 」などでググるとパッとヒットするものがなかったので、それについてご紹介します。
Selenium Webdriverを使ってコードを書いたことがある方、Chrome開発者ツールやFirebugなどの解析ツールを使ったことがある方であれば
この記事を読んでいただくことで「な〜んだ!思ってたよりも簡単にいろいろなことできるようになるじゃん。」と思われるかもしれません。

Chrome DevTools Protocolとは

Chrome DevTools Protocol(以下、CDP)を使うと、WebDriverでは定義されていなかったDevToolsの各種機能(JavaScrioptデバッガ、プロファイラ、パフォーマンスツール、などなど...)が利用できます。
公式ドキュメントはこちら

CDPを使ってどんなことができるのかは、 @d-dai さんが書かれている記事 Chromeデベロッパーツールの使い方まとめにわかりやすく解説がされていましたのでここでは割愛します。

Selenium WebdriverでCDPを使ってみる

まず、CDPには非推奨、実験的なものも含めて以下のようにたくさんのドメインがあります。
これらすべてのリファレンスを書いてみようと思いましたが、各ドメイン毎にもメソッドが定義されており多すぎるため、
ドメインの中で情報を取得するものをいくつかピックアップしてサンプルコードを書いてみました。

Domains

Rubyでの実装例

使用したメソッド

ソースコード

Gemfile
source 'https://rubygems.org'

gem 'selenium-webdriver'
sample.rb
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome

puts '### Page.navigate ###'
driver.execute_cdp('Page.navigate', { url: 'https://google.com' })

puts "\n### Browser.getVersion ###"
puts driver.execute_cdp 'Browser.getVersion'

puts "\n### Network.getAllCookies ###"
cookies = driver.execute_cdp 'Network.getAllCookies'
puts cookies['cookies']

puts "\n### Performance.getMetrics ###"
driver.execute_cdp 'Performance.enable'
metrics = driver.execute_cdp 'Performance.getMetrics'
puts metrics['metrics']

実行結果

取得した一部情報はマスキングしています。

### Page.navigate ###

### Browser.getVersion ###
{"jsVersion"=>"8.8.278.17", "product"=>"Chrome/88.0.4324.192", "protocolVersion"=>"1.3", "revision"=>"@31b458a18f133db9203eb5a5dd6552de0716dda3", "userAgent"=>"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36"}

### Network.getAllCookies ###
{"domain"=>".google.com", "expires"=>1616770705.154825, "httpOnly"=>false, "name"=>"1P_JAR", "path"=>"/", "priority"=>"Medium", "sameSite"=>"None", "secure"=>true, "session"=>false, "size"=>19, "value"=>"2021-02-24-14"}
{"domain"=>".google.com", "expires"=>1629989904.81409, "httpOnly"=>true, "name"=>"NID", "path"=>"/", "priority"=>"Medium", "sameSite"=>"None", "secure"=>true, "session"=>false, "size"=>178, "value"=>"XXXXXX"}

### Performance.getMetrics ###
{"name"=>"Timestamp", "value"=>655734.877406}
{"name"=>"AudioHandlers", "value"=>0}
{"name"=>"Documents", "value"=>2}
{"name"=>"Frames", "value"=>2}
{"name"=>"JSEventListeners", "value"=>173}
{"name"=>"LayoutObjects", "value"=>92}
{"name"=>"MediaKeySessions", "value"=>0}
{"name"=>"MediaKeys", "value"=>0}
{"name"=>"Nodes", "value"=>325}
{"name"=>"Resources", "value"=>17}
{"name"=>"ContextLifecycleStateObservers", "value"=>6}
{"name"=>"V8PerContextDatas", "value"=>1}
{"name"=>"WorkerGlobalScopes", "value"=>0}
{"name"=>"UACSSResources", "value"=>0}
{"name"=>"RTCPeerConnections", "value"=>0}
{"name"=>"ResourceFetchers", "value"=>2}
{"name"=>"AdSubframes", "value"=>0}
{"name"=>"DetachedScriptStates", "value"=>0}
{"name"=>"ArrayBufferContents", "value"=>0}
{"name"=>"LayoutCount", "value"=>0}
{"name"=>"RecalcStyleCount", "value"=>0}
{"name"=>"LayoutDuration", "value"=>0}
{"name"=>"RecalcStyleDuration", "value"=>0}
{"name"=>"DevToolsCommandDuration", "value"=>0.000104}
{"name"=>"ScriptDuration", "value"=>0}
{"name"=>"V8CompileDuration", "value"=>0}
{"name"=>"TaskDuration", "value"=>0.000131}
{"name"=>"TaskOtherDuration", "value"=>2.7e-05}
{"name"=>"ThreadTime", "value"=>0.000256}
{"name"=>"ProcessTime", "value"=>0.36707}
{"name"=>"JSHeapUsedSize", "value"=>7745352}
{"name"=>"JSHeapTotalSize", "value"=>10215424}
{"name"=>"FirstMeaningfulPaint", "value"=>0}
{"name"=>"DomContentLoaded", "value"=>655734.046827}
{"name"=>"NavigationStart", "value"=>655733.006387}
7
7
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
7
7