こんにちは。システム開発部 GX推進グループの牛崎です。
Google Chrome 59やFirefox 56以降から、ヘッドレスモードがサポートされるようになりましたね。ヘッドレスモードというのは、画面を表示せずにWebブラウジングをするモードの事です。 ヘッドレスモードのGoogle Chromeを操作できるGoogle謹製のNode.jsモジュール「Puppeteer」がGitHubで60000以上のStartを集めており、その人気ぶりが伺えます。どんなものか、試してみました。
こんな感じ
今回は仮想環境でUbuntu 18.04を用意し、Linux版Node.jsとPuppeteerにバンドルされているChromiumを使いました。 なお、LinuxへのNode.jsやLinux用日本語フォント (無いとChromiumのマルチバイト文字が文字化けします)のインストール手順は割愛します。
Googleでマネックス証券を検索し、マネックス証券のホームページを開くまでの操作のスクリーンショットを取るコードを書いてみました。
const puppeteer = require('puppeteer'); const assert = require('assert'); (async() => { const browser = await puppeteer.launch({args: ['--no-sandbox']}); const page = await browser.newPage(); // Googleを開く。 await page.goto('https://www.google.co.jp/', {waitUntil: 'domcontentloaded'}); await page.type('#lst-ib', 'マネックス証券'); await page.screenshot({path: '/vagrant/google.png', fullPage: true}); // 検索ボタンをクリックする。 await page.click('input[name="btnK"]'); await page.waitForNavigation({timeout: 5000, waitUntil: 'domcontentloaded'}); await page.screenshot({path: '/vagrant/seach.png', fullPage: true}); // Googleの検索結果からマネックス証券のホームページのリンクをクリックする。 await page.click('a[href="https://www.monex.co.jp/"]'); await page.waitForNavigation({timeout: 5000, waitUntil: 'domcontentloaded'}); await page.screenshot({path: '/vagrant/monex.png', fullPage: true}); // マネックス証券の会社情報へのリンクとなるaタグの中のテキストを取得し、テキストが「会社情報」か否かを判定する。 const company = await page.evaluate(() => { return document.querySelector('a[href="https://info.monex.co.jp/company/index.html"]').innerText; }); assert.strictEqual(company, '会社情報'); // 終了。 await browser.close(); })();
実行してもターミナル上は何も変化がありませんが、裏ではChromiumがぐるぐる動いています。画面を表示したり、検索したり、スクリーンショットを取ったり。 きちんとスクリーンショットは取れていますし、DOMから取得した値をNode.js標準のassertモジュールで検証する事も可能でした。 まだ試していませんが、デバイスの指定も可能なようです。レスポンシブデザインやスマートフォン専用ページの確認もできそうですね。
Chromium・Chrome専用ツールですが、ドキュメントを見るとv5.5.0では試験的にFirefoxもサポートしているようです。今後様々なWebブラウザでE2Eテストが自動化出来たら便利ですね。