こんにちは。ヒューマンクレスト山口です。
私は普段「Selenium」を用いて、Webサイトの自動化しています。
皆さんは自動テストをしながら、HTTPステータスコードを確認したいと思ったことはありませんか?
現在、「Selenium」ではHTTPステータスコードを確認することはできません。
HTTPステータスコードを取得するには様々な方法がありますが、ライブラリを使うのも1つの手段だと思います。
そこで今回は「puppeteer」を用いたWebサイトのテスト自動化を簡単に紹介します。
puppeteerとは?
Chrome DevTools Protocolを用いて、Headless ChromeをNode.jsで操作しやすくしたライブラリです。
2017年8月にリリースされ、ChromeのDevToolチームが開発・メンテナンスしています。
また、多様なAPIが提供されており、様々な操作を簡単に書くことができます。
環境情報
- Mac OS Sierra
- Node.js v8.7.0
- Chrome 最新
puppeteerのインストール
以下のコマンドでインストールできます。
npm i puppeteer
Webサイトを操作する
クリック・入力・チェックなどの基本操作は以下のようにして記載し、実行することができます。
待ち時間をある程度いれないと上手く動作しなかったので、コードの中で待ち時間を記載しています。
const puppeteer = require('puppeteer'); const assert = require('assert'); (async () => { const browser = await puppeteer.launch({headless: true}); const page = await browser.newPage(); let url = "https://example.selenium.jp/reserveApp_Renewal/" //URLを開く await page.goto(url, {waitUntil: 'networkidle',networkIdleTimeout:5000}); //宿泊日を選択する const datepick = await page.$('#datePick'); await datepick.click(); const date_next = await page.$('.next'); await date_next.click(); const date_select = await page.$('.day'); await date_select.click(); await page.waitFor(3000); //名前を入力する page.type('#guestname', 'QuesTest'); await page.waitFor(5000); //「利用規約に同意して次へ」をクリックする const inputElement = await page.$('#agree_and_goto_next'); await inputElement.click(); await page.waitFor(5000); //期間をチェックする const check_term = await page.evaluate(() => { const node = document.body.querySelectorAll('#term'); const array =[]; for (item of node){ array.push(item.innerText); } return array; }); console.log("期間::"+check_term) assert.equal(check_term, "期間: 2017年11月26日 〜 2017年11月27日 1泊") //名前をチェックする const g_name = await page.evaluate(() => { const node = document.body.querySelectorAll('#gname'); const array =[]; for (item of node){ array.push(item.innerText); } return array; }); console.log("名前::"+g_name) assert.equal(g_name, "QuesTest") //ブラウザを閉じる await browser.close(); })();
スクリーンショットを取得する
以下の書き方でスクリーンショットを取得することができます。
スクリーンショットはそのページのすべて(見えてる範囲だけではなく、表示範囲全部)を撮ることが可能です。
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({headless: true}); const page = await browser.newPage(); let url = "https://example.selenium.jp/reserveApp_Renewal/" //URLを開く await page.goto(url); //スクリーンショットを取得する await page.screenshot({path: 'example.png',fullPage:true}); //ブラウザを閉じる await browser.close(); })();
ステータスコードを取得する
以下のように書くことでステータスコードやメソッドを取得できます。
const puppeteer = require('puppeteer'); const assert = require('assert'); let status = ''; (async () => { const browser = await puppeteer.launch({headless: true}); const page = await browser.newPage(); let url = "https://example.selenium.jp/reserveApp_Renewal/" //Method、StatusCode、URLを出力する await page.on('response', response => { const req = response.request(); if (req.url == url) { status = response.status console.log(req.method, response.status, req.url); } }) //URLを開く await page.goto(url); //指定URLのStatusCodeが200であることチェックする assert.equal(status, 200) //ブラウザを閉じる await browser.close(); })();
最後に
「puppeteer」を用いることで、スクリーンショットやステータスコードを簡単に取得することができそうです。
その他にも、UserAgent書き換えやCookie設定、Keyboard操作などWebブラウザでの様々な動作を確認することができます。
皆さまも機会があれば、自動テストの1つの手法として、「puppeteer」を使ってみてはいかがでしょうか。
参考
https://example.selenium.jp/reserveApp_Renewal/