North Detail / ノースディテール

BLOG ブログ

ブログ
CATEGORY
TECH

Node.js+Selenium WebDriverでブラウザのエラーログを取得する話

本記事は、 North Detail Advent Calendar 2019 の19日目の記事です。

Qiita にて作成した記事からの転記となります。 (2019年12月19日公開)

https://qiita.com/surimi_pan/items/c56eef8b29c5c5fb39cf

※本記事は、NorthDetail Advent Calendar 2019の一環として投稿しています

はじめに

こんにちは。
surimi_panです。

本記事はNorth Detail Advent Calendar 2019の19日目の記事となります。
日付の数字(19)が西暦の下2桁(19)と一緒ですが、当記事に19に関わる要素は特にありません。

今回はNode.jsとSelenium WebDriverを利用して、
Google Chromeの開発者ツールにて出力されるログの中にエラーが無いかをチェックします。

要件

  • Google Chromeの開発者ツールに出力されるエラーを取得したい。
  • 取得するエラーログは深刻なものに限る。(WARNINGは含まない)

手段

Selenium WebDriverの、ログを取得する機能( selenium-webdriver/lib/logging )を利用します。
ブラウザのログをレベル(=ログの重要度)で絞り込んで取得することができます。

実装

require('chromedriver');
const chrome = require('selenium-webdriver/chrome');

const webdriver = require('selenium-webdriver');
const Builder = webdriver.Builder;
const capabilities = webdriver.Capabilities.chrome();
const {Preferences, Type, Level} = require('selenium-webdriver/lib/logging');

// ログを調べたいWebページのURL
const targetUrl = '調べたいWebページのURL';

const logPrefs = new Preferences();
logPrefs.setLevel(Type.BROWSER, Level.SEVERE);
capabilities.setLoggingPrefs(logPrefs);

const options = new chrome.Options(capabilities);

// エラーログを出力する
(async function printConsoleErrors() {
  const driver = await new Builder().forBrowser('chrome')
                                    .setChromeOptions(options)
                                    .build();

  await driver.get(targetUrl);
  await driver.sleep(5000);

  let errors = await driver.manage()
                           .logs()
                           .get(Type.BROWSER);
  for(var i=0; i < errors.length; i++) {
    console.log(errors[i].message);
  }

  await driver.quit();
})();

詳細

取得するログの種類の絞り込み

const logPrefs = new Preferences();
logPrefs.setLevel(Type.BROWSER, Level.SEVERE);
capabilities.setLoggingPrefs(logPrefs);

取得するログの種類、レベルを絞り込みます。
今回はブラウザのエラーログを取得したいので、
取得したいログの対象をBROWSER(ブラウザ)、
取得したいログのレベルをSEVERE(最も深刻なもの→エラー)に設定します。

ログの絞り込みの設定を適用

const options = new chrome.Options(capabilities);
const driver = await new Builder().forBrowser('chrome')
                                  .setChromeOptions(options)
                                  .build();

WebDriverインスタンスを作る際にログの絞り込み設定を反映させます。

ページの遷移と待機

await driver.get(targetUrl);
await driver.sleep(5000);

チェックしたいページに遷移して一定時間待機します。
時間差でエラーが出るものを考慮して気持ち長めに待機時間を設定しています。

エラーログの取得

let errors = await driver.manage()
                         .logs()
                         .get(Type.BROWSER);

ブラウザのエラーログを取得します。
取得されるログのレベルはSEVEREに設定されていますので、エラーのみ取得します。

取得したエラーの出力

for(var i=0; i < errors.length; i++) {
  console.log(await errors[i].message);
}

配列で返ってくるので、展開してコンソールに出力します。

まとめ

実行すると、エラーを吐くページではエラーログが次々出力されます。

Webページのスクレイピングやフォームのテスト等で利用されがちなSeleniumですが、
変わったこともできますよ!という記事でした。

資料が少なく、公式ドキュメントとにらめっこしながらの実装となりました。
不備不足あればご指摘頂けると大変助かります。

SURIMI PAN
WRITER:SURIMI PAN
バックエンドとフロントエンドを反復横跳びしている。
できなかった事ができるようになった瞬間が好き。
主な記事 一覧へ

一覧へ

IS 501383 / ISO 27001