テスト自動化- puppeteer

image

こんにちは。ヒューマンクレスト山口です。
私は普段「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/

このエントリーをはてなブックマークに追加