自動待機
はじめに
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)
でのクリックをキャプチャするかどうかをチェックします。
例えば、Playwrightがlocator.click()がいつ呼び出されたかに関わらず、「サインアップ」ボタンをクリックするシナリオを考えてみましょう。
- ページがユーザー名の一意性をチェックしており、「サインアップ」ボタンが無効になっている;
- サーバーでの確認後、無効だった「サインアップ」ボタンが、有効になった別のボタンに置き換えられる。