自動待機
はじめに
Playwright は、アクションが期待どおりに動作することを確認するために、アクションを実行する前に要素に対してさまざまな操作性チェックを実行します。関連するすべてのチェックが合格するまで自動的に待機し、その後要求されたアクションを実行します。必要なチェックが指定された timeout 内に合格しない場合、アクションは TimeoutError で失敗します。
たとえば、locator.click() の場合、Playwright は以下を保証します。
- ロケーターが正確に 1 つの要素に解決されること
- 要素が可視であること
- 要素がアニメーション中ではないか、アニメーションが完了しているなど、安定していること
- 要素が他の要素によって隠されていないなど、イベントを受信すること
- 要素が有効であること
各アクションに対して実行される操作性チェックの完全なリストは次のとおりです
| アクション | 可視 | 安定 | イベントを受信する | 有効 | 編集可能 |
|---|---|---|---|---|---|
| locator.check() | はい | はい | はい | はい | - |
| locator.click() | はい | はい | はい | はい | - |
| locator.dblclick() | はい | はい | はい | はい | - |
| locator.setChecked() | はい | はい | はい | はい | - |
| locator.tap() | はい | はい | はい | はい | - |
| locator.uncheck() | はい | はい | はい | はい | - |
| locator.hover() | はい | はい | はい | - | - |
| locator.dragTo() | はい | はい | はい | - | - |
| locator.screenshot() | はい | はい | - | - | - |
| locator.fill() | はい | - | - | はい | はい |
| locator.clear() | はい | - | - | はい | はい |
| locator.selectOption() | はい | - | - | はい | - |
| locator.selectText() | はい | - | - | - | - |
| locator.scrollIntoViewIfNeeded() | - | はい | - | - | - |
| locator.blur() | - | - | - | - | - |
| locator.dispatchEvent() | - | - | - | - | - |
| locator.focus() | - | - | - | - | - |
| locator.press() | - | - | - | - | - |
| locator.pressSequentially() | - | - | - | - | - |
| locator.setInputFiles() | - | - | - | - | - |
アクションの強制実行
locator.click() のような一部のアクションは、重要でない操作性チェックを無効にする force オプションをサポートしています。たとえば、locator.click() メソッドに真値の force を渡すと、ターゲット要素が実際にクリックイベントを受信するかどうかのチェックは行われません。
アサーション
Playwright には、アクション前の自動待機と同様に、条件が満たされるまで待機することで不安定さを排除する自動再試行アサーションが含まれています。
| アサーション | 説明 |
|---|---|
| expect(locator).toBeAttached() | 要素が添付されている |
| expect(locator).toBeChecked() | チェックボックスがチェックされている |
| expect(locator).toBeDisabled() | 要素が無効になっている |
| expect(locator).toBeEditable() | 要素が編集可能である |
| expect(locator).toBeEmpty() | コンテナが空である |
| expect(locator).toBeEnabled() | 要素が有効である |
| expect(locator).toBeFocused() | 要素がフォーカスされている |
| expect(locator).toBeHidden() | 要素が非表示である |
| expect(locator).toBeInViewport() | 要素がビューポートと交差している |
| expect(locator).toBeVisible() | 要素が表示されている |
| expect(locator).toContainText() | 要素にテキストが含まれている |
| expect(locator).toHaveAttribute() | 要素が DOM 属性を持つ |
| expect(locator).toHaveClass() | 要素がクラスプロパティを持つ |
| expect(locator).toHaveCount() | リストが正確な数の子要素を持つ |
| expect(locator).toHaveCSS() | 要素が CSS プロパティを持つ |
| expect(locator).toHaveId() | 要素が ID を持つ |
| expect(locator).toHaveJSProperty() | 要素が JavaScript プロパティを持つ |
| expect(locator).toHaveText() | 要素がテキストに一致する |
| expect(locator).toHaveValue() | 入力に値がある |
| expect(locator).toHaveValues() | 選択にオプションが選択されている |
| expect(page).toHaveTitle() | ページにタイトルがある |
| expect(page).toHaveURL() | ページに URL がある |
| expect(response).toBeOK() | レスポンスが OK ステータスを持つ |
アサーションガイドで詳細をご覧ください。
可視
要素は、非空の境界ボックスを持ち、visibility:hidden の計算スタイルを持たない場合に可視と見なされます。
この定義によると
- ゼロサイズの要素は可視とは見なされません。
display:noneの要素は可視とは見なされません。opacity:0の要素は可視と見なされます。
安定
要素は、少なくとも2つの連続するアニメーションフレームで同じ境界ボックスを維持している場合に安定と見なされます。
有効
要素は、**無効ではない**場合に有効と見なされます。
要素は以下のいずれかの条件で**無効**とされます。
[disabled]属性を持つ<button>、<select>、<input>、<textarea>、<option>または<optgroup>である場合。[disabled]属性を持つ<fieldset>の一部である<button>、<select>、<input>、<textarea>、<option>または<optgroup>である場合。[aria-disabled=true]属性を持つ要素の子孫である場合。
編集可能
要素は、有効であり、かつ**読み取り専用ではない**場合に編集可能と見なされます。
要素は以下のいずれかの条件で**読み取り専用**とされます。
[readonly]属性を持つ<select>、<input>、または<textarea>である場合。[aria-readonly=true]属性を持ち、それがサポートするARIAロールを持つ場合。
イベントを受信する
要素は、アクションポイントでのポインタイベントのヒットターゲットである場合にポインタイベントを受信すると見なされます。たとえば、(10;10) のポイントをクリックする場合、Playwright は、他の要素(通常はオーバーレイ)が代わりに (10;10) でクリックをキャプチャするかどうかをチェックします。
例えば、locator.click() が呼び出された時期に関わらず、Playwright が「サインアップ」ボタンをクリックするシナリオを考えてみましょう。
- ページはユーザー名が一意であるかを確認しており、「サインアップ」ボタンは無効になっています。
- サーバーでの確認後、無効だった「サインアップ」ボタンは、現在有効になっている別のボタンに置き換えられます。