株式会社モンスターラボ ホールディングス(グループ)


    株式会社モンスターラボ


    株式会社モンスターラボBX


    株式株式会社A.C.O.

    モード変更


    言語

Try Playwright

2022/01/14

Playwright とは、Microsoft が中心に開発をしている web のテストや自動化のフレームワークです。2020 年にリリースされ、テスト自動化のフレームワークとしては後発で、npm のトレンドでは Cypress や Puppeteer と比べると、ダウンロード数はまだまだ少ないですが、Github の Star 数は Cypress にも匹敵している人気のフレームワークです。 言語は JavaScript、TypeScript、Python、Java、.NET に対応しているので、web の E2E テストを書いたことがある方なら、簡単に試すことができますね。 モンスターラボでは Selenium や WebdriverIO を使うことが多く、他のツールに振れる機会がないので、試しに使ってみようと思います。

Playwright の特徴

クロスブラウザテスト

Chromium(Google chrome や Microsoft Edge)、Firefox、Webkit(Safari)が 1 つの API で実行できるため、クロスブラウザでのテストが容易に行えます。Safari に対応していないために、Cypress や Puppeteer の利用を諦めたという方も多いのではないでしょうか。 Playwright では、下記のように設定ファイルに記載するだけで、手軽に試すことができます。

const config: PlaywrightTestConfig = {
  projects: [
    {
      name: "chromium",
      use: { ...devices["Desktop Chrome"] },
    },
    {
      name: "firefox",
      use: { ...devices["Desktop Firefox"] },
    },
    {
      name: "webkit",
      use: { ...devices["Desktop Safari"] },
    },
  ],
};

Auto-waiting

自動テストでは要素が見つからない、操作できないことによるエラーが非常に多く、自動テストを書いたことがある人なら必ず体験したことがあるはずです。これを解決するために要素の出現を待つ API の記載が必要でしたが、Playwright ではデフォルトで Auto waitingが採用されているので、コードを簡潔に書くことができます。

位置情報の偽装

Playwright では、デバイスや User agent、位置情報を偽装することができます。 試しに、位置情報をエッフェル塔に設定して、Google Map で東京タワーを検索し、現在地に移動するテストを書いてみました。

import { test, expect, chromium } from "@playwright/test";

test("my test", async ({ page }) => {
  // Open browser and open google Top page
  await page.goto("https://www.google.com/");

  // Input Tokyo Tower in the search form.
  await page.fill(".gLFyf", "東京タワー");

  // Start search
  await page.keyboard.down("Enter");

  // Wait for the map to appear
  await page.locator("#lu_map").waitFor();

  await page.click("#lu_map");

  // Move the cursor to the button
  await page.locator("#pWhrzc-mylocation").hover();

  // Wait for the text to appear
  await page.locator('text="デバイスに基づく"').waitFor();

  // Click the Show Current Location button
  await page.locator("#pWhrzc-mylocation").click();
});

※ デフォルトで Auto wait が採用されていると前述しましたが、地図の表示については、明示的に wait を入れています。おそらく他の API を利用すれば記載は不要になるはずなので、後日試してみようと思います。

偽装する位置情報は、設定ファイルに記載してます。

const config: PlaywrightTestConfig = {
  use: {
    geolocation: { longitude: 2.294481, latitude: 48.858807 },
    permissions: ["geolocation"],
  },
};

画像比較テスト

Visual comparisons の機能で、画像比較のテストが簡単に行うことができます。この機能は、pixelmatch のライブラリが使われており、threshold の指定を指定することもできます。デフォルトの設定では結果として Fail になるだけで、画像のどの部分が異なるのかは明記されないので、カスタマイズが必要なようです。

Trace Viewer

Playwright を使ってみて、一番良かったのは Trace Viewer です。この機能はテストの実行結果を GUI でトレースすることができる機能で、テストにどれくらいの時間がかかったか、どの時間帯にどういう動きをしていたか、を探索することができます。 実際に画面の動きはこのようになります。

©2022 Google

この機能や各テストの Video や Screenshot についても設定ファイルに記載するだけで実装できます。

const config: PlaywrightTestConfig = {
  use: {
    video: "on",
    trace: "on",
    screenshot: "on",
  },
};

テスト実行後は、trace.zip というファイルが作られるので、以下のコマンドを実行すると Trace Viewer が立ち上がります。

npx playwright show-trace test-results/tests-googlemap-my-test-chromium/trace.zip

まとめ

今回 Playwright を試してみましたが、非常に良いツールだと感じました。ツールの使い勝手も良いですし、何より公式のドキュメントが充実しているのがありがたいです。自動テストを書いてみたい方はぜひ使ってみてください。

Playwright には紹介した機能以外にも、レポート機能や、Test Generator という GUI での操作をテストコードに変換する Selenium IDE のような機能など他にもたくさんの機能があります。最近ではアップデートも頻繁に行われていて、新しい API も順次追加されているので、今後の Playwright にも注目です!

qaautomation testing

Author

Ryosuke Hashimoto

Ryosuke Hashimoto

SET(Software engineering in test)

Automation Test, JavaScript/TypeScript

その他おすすめ記事

2022/07/19

Monstarlab版NestJS スターターキット

TL;DR: NestJS Frameworkを基に Node.js の backend スターターキットを構築しました。モノリシック なアーキテクチャを採用し、REST API を実装しています。 スターターキットはオープンソースでこちらのGithub Repoにて公開しています。 はじめに Monstarlabでは最新の技術ソリューションを用いて、企業様が抱えるビジネス課題を解決するべく、製品開発およびコンサルティングを行っております。 Monstarlab のエンジニアは 4〜6 ヶ月毎に新しいお客...

Sivan Payyadakath

Sivan Payyadakath

Nodejs

2022/06/09

コードレビューをしよう

入社して間もない頃、先輩から初めてコードレビューを依頼されたとき、光栄に思う反面戸惑いも覚えました。先輩の長年のコーディング経験に対して、自分のような若輩者が指摘できることなどあるのだろうかと戸惑ったのです。その時私が理解していなかったのは、最高のコードなんてものは存在しない、ということでした。ベストなコードとは、コードがないことなのです。1 プロジェクトに追加される新しいコードの1行は、すべからく、ビルド、テスト、レビュー、デバッグ、そして後で必要ならロードテストが必要となります。たとえば、仮にあなたが...

Serigne Mbacke Ndiaye

Serigne Mbacke Ndiaye