Playwright の導入から各種実行方法について試してみた

## はじめに

手軽に E2E テストを実行できる Playwright を触るために、導入から各種実行方法について、ドキュメントを見ながら実際に試してみました。基本的にはドキュメントの通り、進めることができるかと思いますが、実際に利用するであろう設定や実行方法など試してみたので、参考になれば幸いです。

https://playwright.dev/

## Playwright をインストール

以下のコマンドを実行し、各種設定を選択することでプロジェクトの雛形が作成されます。

```zsh
% npm init playwright@latest
```

各種パッケージがインストールされて、設定ファイル、テストのサンプルコードなどが作成されます。
```
├── node_modules
├── package-lock.json
├── package.json
├── playwright.config.ts
├── tests
│   └── example.spec.ts
└── tests-examples
    └── demo-todo-app.spec.ts
```

https://playwright.dev/docs/intro#installing-playwright

## 既存のプロジェクトに Playwright をインストール

```zsh
% npm init playwright@latest
...
✔ Where to put your end-to-end tests? · tests
✔ Add a GitHub Actions workflow? (y/N) · false
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · true
Installing Playwright Test (npm install --save-dev @playwright/test)…

added 3 packages, and audited 219 packages in 3s
...
```

既存のプロジェクトにインストールした場合は、依存関係に以下の２つのパッケージが追加されました。
```
"devDependencies": {
    "@playwright/test": "^1.45.1",
    "@types/node": "^20.14.10",
...
```

## ブラウザをインストール

Playwright で利用するブラウザをインストールするには、以下のコマンドを実行します。ここでインストールされるブラウザは、ホスト OS にインストールされる通常のブラウザとは異なり、Playwright がテスト実行時に使用するブラウザです。

```zsh
% npx playwright install
```

引数で指定して、特定のブラウザを個別にインストールすることもできます。

```zsh
% npx playwright install chrome
```

https://playwright.dev/docs/browsers

## 特定のブラウザで実行する

Playwright では、特定のブラウザを指定してテストを実行することができます。対象のブラウザは `playwright.config.ts` ファイルに定義します。以下の設定例では、WebKit と Chrome を指定しています。（設定できるデバイス一覧は[こちらを参照](https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json)）

https://playwright.dev/docs/test-projects

```typescript
projects: [
    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] },
    },

    {
      name: 'chrome',
      use: { ...devices['Desktop Chrome'] },
    },
]
```

上記の通り設定してある場合は、`webkit` または `chrome` を `project` オプションに指定して実行することができます。`project` オプションを指定しなかった場合は、`projects` で定義されているブラウザで実行されます。また、ブラウザの定義が増えるとブラウザ毎に同じテストを実行するので、テストケース数が `5` 件でブラウザの定義が `2` 件の場合は、トータルで `10` 件のテストが実行されることになります。

```zsh
% npx playwright test --project webkit
```

## ブラウザを起動しないで（ヘッドレス） またはブラウザを起動して実行する

ブラウザの起動を切り替えるオプションは、設定ファイルだとこちらのフラグで切り替えることができます。

https://playwright.dev/docs/api/class-testoptions#test-options-headless

また、実行時のオプションでブラウザで起動することもできます。

```zsh
% npx playwright test --headed
```

## テストをデバッグする

テストをデバッグする方法の１つとして、UI モードを利用してデバッグすることができます。UI モードを利用することで、テストのステップ実行や状態の表示、監視などテストケースをデバッグすることができます。
テスト実行後は、該当のソース、エラーの内容、コンソール Log 等の実行時の状態を詳細に確認することができます。

https://playwright.dev/docs/test-ui-mode

### テストを UI モードで起動

```zsh
% npx playwright test --ui
```

### テストを実行

各テストが、ファイル、test コードの describe、テストケース毎に実行することができます。

![uimode_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/c8b96228-eb26-7df7-4024-05ac623d6889.png)

### ステップごとにテスト結果を確認

テスト結果をステップごとに確認することができます。これにより、アクション実行前、対象のアクション時、アクション後の DOM の状態を確認することができます。

![uimode-debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/5c6c8fac-2cda-18e4-602e-ebdad835529f.png)

### Locator を確認

テスト実行時の DOM から [Locator](https://playwright.dev/docs/api/class-locator) を確認することができます。これにより、DOM の要素がうまく操作できない場合などのデバッグがやりやすくなりそうです。

![uimode-picklocator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/ba47c740-2232-682b-3d68-2b54d4581341.png)

### エラー内容の確認

テストがエラーとなった場合、テストケースが Failed となります。このテストケースの結果を開くと、エラーとなった処理、エラーの内容を確認することができます。

![uimode-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/ab9972ec-ea18-0ca7-d8b2-9501d2222b09.png)

## IntelliJ IDEA でテストを実行する

コマンドで実行することはできますが、IDE を使ってテストを実行することもできます。IntelliJ IDEA を利用した場合は、通常のテストランナーと同様に、テストコード上からテストやデバッグを実行することができます。VS Code の場合は Extension を利用することで実行できます。詳しくは[こちらの公式ドキュメント](https://playwright.dev/docs/getting-started-vscode)を確認してください。

### テストを実行

通常のテストコードの実行と同様に実行することができます。テスト対象のファイルを開き、対象のテストやテストグループのメニューから `Run` を選択するとテストが実行されます。

![intellij-exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/4a2208d7-888c-c0cf-d7d7-fb5c3fc26dd3.png)

### テストをデバッグ実行

通常のテストコードのデバッグと同様にデバッグ実行することができます。対象のテストのメニューから `Debug` を選択することでデバッグ実行となります。もしブレークポイントなどを設定して、DOM の状態を確認したいという場合は、[ブラウザを起動して実行する](#ブラウザを起動しないで（ヘッドレス）-またはブラウザを起動して実行する)ように設定しておくことで、ブレークポイント時の DOM の状態も確認することができます。

![intellij-debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/54da36aa-cdee-f080-23f9-01dfce47d20c.png)

![debug-dom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/c123ceb0-dcc9-b4d5-177c-8d7b4423f10e.png)

## 失敗したテストをリトライする

不安定なテストがある場合、テスト全体が失敗し、再実行が必要になることがあります。そのような状況に備えて、リトライ設定をしておくと、失敗したテストを自動的に再試行することができます。

https://playwright.dev/docs/test-retries

### 設定ファイルで指定

```typescript
export default defineConfig({
  retries: 2,  // リトライ回数
});
```

### コマンドで指定

```zsh
% npx playwright test --retries=2
```

## GitHub Actions で実行する

実装したテストを CI で実行できるように、[GitHub Actions](https://playwright.dev/docs/ci-intro#setting-up-github-actions) を設定します。その他の CI ツールでの設定方法も解説されているので、詳細は公式ドキュメントを確認してください。

https://playwright.dev/docs/ci

### ワークフローを作成

GitHub Actions のワークフローは以下のように実装しました。実行環境を構築して、テストを実行します。テスト結果を確認できるように結果レポートを GitHub Pages に配置します。なおテスト結果レポートについては公式のサンプルだと[ダウンロードして確認する](https://playwright.dev/docs/ci-intro#html-report)手順となっていたので、環境に合わせて設定してください。
また、ワークフローをトリガーするイベントについても、プロジェクトな事情に合わせて、設定するのが良いと思います。

```yaml
name: CI
on:
  workflow_dispatch:
permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  test:
    timeout-minutes: 30
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Install dependencies
        run: npm ci
      - name: Install Playwright Browsers
        run: npx playwright install --with-deps
      - name: Run Playwright tests
        run: npx playwright test
      - name: Setup GitHub Pages
        uses: actions/configure-pages@v5
      - name: Upload artifact to GitHub Pages
        uses: actions/upload-pages-artifact@v3
        with:
          path: playwright-report/
      - name: Deploy to GitHub Pages
        uses: actions/deploy-pages@v4
```

### テストを実行

このワークフローは、`workflow_dispatch` イベントで手動トリガーを設定しています。手動でテストを実行し、テストが完了すると、実行結果をコンソールで確認することができます。

![github-actions-result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331769/b448e709-fd91-077d-b20c-0f0f9e32bd05.png)

### テスト結果レポートを確認

テスト結果のレポートが HTML で作成されるので、結果を確認してみます。テストの成否、テスト実行時間、エラー時はエラー内容などを確認することができます。

https://ore88ore.github.io/playwright-react-example/

## 参照

### ソース

試してみた実際のソースは、以下のリポジトリから確認することができます。

https://github.com/ore88ore/playwright-react-example