Shadow DOM を使用したアプリケーションのテスト実行
概要
Shadow Document Object Model (DOM) API は、カプセル化された DOM ツリーを HTML 要素にアタッチすることを可能にする Web コンポーネントです。Shadow DOM は自己完結しており、メインドキュメントの DOM から分離されたままです。
Shadow DOM は、以下のような用途に使用することができます。
- サードパーティライブラリからのフォームとコンポーネント
- 埋め込みコンテンツ (動画や画像など)
- チャットポップアップインテグレーション
カプセル化モードとステップの目的に応じて、ブラウザテストアクションを利用して、Shadow DOM 内にレンダリングされた要素と対話し、検証するテストを構成します。このガイドでは、これらのアクションとアサーションタイプについて説明します。
オープンモード
open
モードでは、通常のアサーションは使用できません。JavaScript のアサーションを使用して、Element.shadowRoot
プロパティを使用して Shadow DOM にレンダリングされた要素と対話し、検証することができます。
テキストの存在をアサートする
“TODO” というテキストがページ上に表示されていることを確認するには、メインドキュメントの <body>
要素から直接 innerHTML
プロパティをクエリします。
return document.querySelector("body").innerHTML.includes("TODO")
レンダリングされたテキストの検証
Shadow DOM でレンダリングされた要素内にテキストがレンダリングされていることを検証するには、shadowRoot
プロパティを使用して、それぞれの要素および innerHTML
または textContent
プロパティにアクセスします。
例えば、次のコードは <h3>
HTML タグに表示されたテキスト “TODO" を検証します。
// Shadow DOM がアタッチされている要素を探します:
let element = document.querySelector("body > editable-list")
// shadowRoot プロパティを使用して、Shadow DOM 内の <h3> 要素を特定します:
let shadowDomElement = element.shadowRoot.querySelector("div > h3")
// Shadow DOM 要素の textContent をチェックします:
return shadowDomElement.textContent.includes("TODO")
入力フィールドにテキストを入力する
テキスト入力フィールドがメインドキュメントの DOM ツリーにレンダリングされると、Datadog ブラウザテストレコーダーは自動的に入力された値を記録し、Type Text テストステップを作成します。
Shadow DOMでレンダリングされた入力フィールドを扱う場合、レコーダーが要素への参照点の完全なセットをキャプチャできないことがあり、テスト実行でステップが失敗することがあります。Shadow DOM で表示されるテキスト入力フィールドにテキストを入力するための回避策として、それぞれの <input>
要素を探し、 value
フィールドを設定する JavaScript のアサーションを追加してください。
たとえば、次のコードでは、入力フィールドに「Item added with JS assertion」というテキストが追加されます。
// Shadow DOM がアタッチされている要素を探します:
let element = document.querySelector("body > editable-list")
// shadowRoot プロパティを使用して、Shadow DOM 内の <input> 要素を特定します:
let shadowDomInput = element.shadowRoot.querySelector("input")
// <input> 要素に value プロパティを設定します:
shadowDomInput.value = "Item added with JS assertion"
return true
要素をクリックする
Shadow DOM でレンダリングされた要素に対してクリックを発生させるには、それぞれの要素を見つけて .click()
を実行します。
例えば、以下のコードスニペットでは、button 要素のクリックをトリガーしています。
// Shadow DOM がアタッチされている要素を探します:
let element = document.querySelector("body > editable-list")
// shadowRoot プロパティを使用して、Shadow DOM 内の <button> 要素を特定します:
let shadowDomButton = element.shadowRoot.querySelector("button.editable-list-add-item")
// ボタンのクリックをトリガーします:
shadowDomButton.click()
return true
クローズドモード
closed
モードでは、通常のアサーションは使用できません。さらに、shadow DOM でレンダリングされた要素には JavaScript でアクセスできないので、ブラウザテストで JavaScript のアサーションを使用することはできません。
Press Key
アクションを使用すると、適切なオプションを選択することができます。例えば、ナビゲーションメニューからオプションを選択して別のページに移動する場合、メニューが Shadow DOM でレンダリングされていれば、tab
キーでそれぞれのオプションに移動し、enter
キーをクリックしてオプションを選択します。
その他の参考資料