自動待機
はじめに
Playwrightは、要素に対してアクションを実行する前に、それらのアクションが期待どおりに動作することを保証するために、さまざまな実行可能性チェックを実行します。関連するすべてのチェックが合格するまで自動的に待機し、その後要求されたアクションを実行します。指定されたtimeout
内に必要なチェックが合格しない場合、アクションはTimeoutError
で失敗します。
例えば、locator.click()の場合、Playwrightは以下を保証します。
- ロケーターが正確に1つの要素に解決されること
- 要素が可視であること
- 要素が安定していること(アニメーション中でないか、アニメーションが完了していること)
- 要素がイベントを受け取れること(他の要素によって隠されていないこと)
- 要素が有効であること
以下は、各アクションで実行される実行可能性チェックの完全なリストです。
アクション | 可視 | 安定 | イベント受信 | 有効 | 編集可能 |
---|---|---|---|---|---|
locator.check() | はい | はい | はい | はい | - |
locator.click() | はい | はい | はい | はい | - |
locator.dblclick() | はい | はい | はい | はい | - |
locator.set_checked() | はい | はい | はい | はい | - |
locator.tap() | はい | はい | はい | はい | - |
locator.uncheck() | はい | はい | はい | はい | - |
locator.hover() | はい | はい | はい | - | - |
locator.drag_to() | はい | はい | はい | - | - |
locator.screenshot() | はい | はい | - | - | - |
locator.fill() | はい | - | - | はい | はい |
locator.clear() | はい | - | - | はい | はい |
locator.select_option() | はい | - | - | はい | - |
locator.select_text() | はい | - | - | - | - |
locator.scroll_into_view_if_needed() | - | はい | - | - | - |
locator.blur() | - | - | - | - | - |
locator.dispatch_event() | - | - | - | - | - |
locator.focus() | - | - | - | - | - |
locator.press() | - | - | - | - | - |
locator.press_sequentially() | - | - | - | - | - |
locator.set_input_files() | - | - | - | - | - |
アクションの強制実行
例えば、locator.click()のような一部のアクションは、本質的ではない実行可能性チェックを無効にするforce
オプションをサポートしています。例えば、locator.click()メソッドに真値のforce
を渡すと、ターゲット要素が実際にクリックイベントを受け取るかどうかのチェックは行われません。
アサーション
Playwrightには、アクション前の自動待機と同様に、条件が満たされるまで待機することで不安定さを排除する自動リトライアサーションが含まれています。
アサーション | 説明 |
---|---|
expect(locator).to_be_attached() | 要素がアタッチされている |
expect(locator).to_be_checked() | チェックボックスがチェックされている |
expect(locator).to_be_disabled() | 要素が無効である |
expect(locator).to_be_editable() | 要素が編集可能である |
expect(locator).to_be_empty() | コンテナが空である |
expect(locator).to_be_enabled() | 要素が有効である |
expect(locator).to_be_focused() | 要素がフォーカスされている |
expect(locator).to_be_hidden() | 要素が非可視である |
expect(locator).to_be_in_viewport() | 要素がビューポートと交差している |
expect(locator).to_be_visible() | 要素が可視である |
expect(locator).to_contain_text() | 要素がテキストを含んでいる |
expect(locator).to_have_attribute() | 要素にDOM属性がある |
expect(locator).to_have_class() | 要素にクラスプロパティがある |
expect(locator).to_have_count() | リストに正確な数の子がある |
expect(locator).to_have_css() | 要素にCSSプロパティがある |
expect(locator).to_have_id() | 要素にIDがある |
expect(locator).to_have_js_property() | 要素にJavaScriptプロパティがある |
expect(locator).to_have_text() | 要素がテキストと一致する |
expect(locator).to_have_value() | 入力に値がある |
expect(locator).to_have_values() | 選択肢が選択されている |
expect(page).to_have_title() | ページにタイトルがある |
expect(page).to_have_url() | ページにURLがある |
expect(response).to_be_ok() | レスポンスのステータスが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が「サインアップ」ボタンをクリックするシナリオを考えてみましょう。
- ページがユーザー名の一意性を確認しており、「サインアップ」ボタンが無効になっている状態;
- サーバーとの確認後、無効だった「サインアップ」ボタンが、現在有効になっている別のボタンに置き換えられる状態。