Tech Bytes

短くて分かりやすい技術情報を記事として共有します。みなさんにとって学びになれば幸いです。

PlaywrightでE2Eテストを行う場合のlocatorの書き方

プログラミングのlocatorの役割

プログラミングにおける「locator」は、一般的には特定の場所や要素を指し示すための機能や仕組みを指します。
具体的な役割は、文脈や具体的な技術によって異なりますが、一般的には以下のようなものがあります。

1. ファイルロケーター:
プログラムが特定のファイルを見つけるための仕組みや機能。
これは、ファイルパス、URL、または他の識別子を使用して、プログラムが必要なリソースを見つけるのに役立ちます。

2. エレメントロケーター:
ウェブ開発やテスト自動化のコンテキストでは、特定のHTML要素やUI要素を見つけるための仕組みです。
例えば、XPathやCSSセレクタを使用して、特定のボタンやテキストフィールドなどの要素を見つけることができます。

3. データロケーター:
データベースやデータストレージ内で特定のデータを見つけるための仕組み。
これは、SQLクエリやNoSQLデータベースのクエリ、または特定のキーを使用して、データベース内の情報を特定するのに使用されます。

4. サービスロケーター:
サービスやリソースを見つけるための仕組み。
これは、分散システムやマイクロサービスアーキテクチャにおいて、特定のサービスやリソースの場所を特定するために使用されます。

5. 地理的ロケーター:
特定の地理的位置や座標を示す仕組み。
これは、地図アプリや位置ベースのサービスで使用され、特定の場所を特定するために使用されます。

これらのロケーターの役割は、それぞれのコンテキストや使用されている技術に応じて異なりますが、基本的にはプログラムが特定の対象を見つけるための手段を提供します。

PlaywrightでE2Eテストを行う場合のlocatorの書き方

Playwrightは、ウェブアプリケーションのE2E(End-to-End)テストを行うためのツールであり、要素を特定するためのロケーターとして様々な方法を提供しています。
一般的な方法は、CSSセレクタ、XPath、テキスト、または属性に基づく方法です。
以下に、Playwrightでのロケーターの書き方の例を示します。

1. CSSセレクタを使用する場合:

const element = await page.$('button'); // <button>要素を見つける

2. XPathを使用する場合:

const element = await page.$x('//button[contains(text(), "Submit")]'); // テキストが"Submit"の<button>要素を見つける

3. テキストを使用する場合:

const element = await page.locator('button').withText('Submit'); // テキストが"Submit"のボタンを見つける

4. 属性に基づく場合:

const element = await page.locator('input[type="text"]'); // type属性が"text"の<input>要素を見つける

これらの例では、page.$()、page.$x()、page.locator()などのPlaywrightのAPIを使用して要素を取得しています。
$()はCSSセレクタ、$x()はXPath、locator()はテキストや属性を基にした要素のロケーションを行います。

E2Eテストでは、要素を一意に特定することが重要です。
そのため、適切なロケーターを使用して要素を見つけることが必要です。
適切なロケーターを選択する際には、ウェブアプリケーションの構造や要件に合わせて最適な方法を選択することが重要です。

なぜawaitが必要になるのか

Playwrightを含む多くのモダンなJavaScriptフレームワークやライブラリは、非同期処理を利用しています。
非同期処理は、ウェブアプリケーションやネットワークリクエストなど、時間のかかる操作を効率的に処理するための手法です。

JavaScriptにおいて、非同期処理は通常、Promiseと呼ばれるオブジェクトを返す関数を使用して実装されます。
Promiseは、将来のある時点で値やエラーを提供する非同期操作を表現します。

awaitは、Promiseベースの非同期操作を行う関数内で使用されます。
awaitキーワードを使用すると、その行の処理が完了するまで次の行に進まず、非同期操作の完了を待ちます。
これにより、非同期操作の結果を取得し、それを処理することができます。

PlaywrightのAPIメソッド(たとえば、page.$()やpage.$x()など)は非同期操作を行うため、それらを使用する際にはawaitを使用する必要があります。
なぜなら、ウェブページのロードや要素の検索などの操作は時間がかかる可能性があるため、非同期的に行われるからです。

例えば、次のコードでは、page.$()メソッドが非同期であるため、その結果を取得するためにawaitが必要です。

const element = await page.$('button'); // ボタン要素を取得する非同期操作

もしawaitを使わない場合、非同期操作の完了を待たずに次の行が実行されてしまい、予期しない結果が生じる可能性があります。