自動ウェイト
はじめに
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` オプションをサポートしており、例えば、真偽値の `force` を locator.click() メソッドに渡すと、ターゲット要素が実際にクリックイベントを受信するかどうかのチェックを無効にします。
アサーション
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() | 要素が class プロパティを持つ |
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** でない場合に編集可能と見なされます。
要素は、次の場合に**readonly** になります
- `[readonly]` 属性を持つ
<select>
、<input>
、または<textarea>
である場合。 - `[aria-readonly=true]` 属性を持ち、それをサポートする aria ロールを持つ場合。
イベントを受信
要素は、アクションポイントでのポインターイベントのヒットターゲットである場合に、ポインターイベントを受信していると見なされます。たとえば、(10;10)
のポイントをクリックする場合、Playwright は、(10;10)
でのクリックを代わりにキャプチャする別の要素 (通常はオーバーレイ) があるかどうかをチェックします。
たとえば、Playwright が locator.click() 呼び出しが行われたタイミングに関係なく [サインアップ] ボタンをクリックするシナリオを考えてみましょう。
- ページは、ユーザー名が一意であり、[サインアップ] ボタンが無効になっていることをチェックしています。
- サーバーとのチェック後、無効になっている [サインアップ] ボタンは、現在有効になっている別のボタンに置き換えられます。