変更される可能性がある DOM 検査テスト
Lightning Experience の HTML、CSS、DOM のコンテンツおよび構造は、いつでも変更される可能性があるため、安定した API と考えることはできません。Selenium WebDriver などのツールを使用してコンポーネント内部にアクセスする UI テストでは、継続的なメンテナンスが必要になります。
Salesforce では、HTML、CSS、または DOM の下位互換性は保証されません。Lightning Experience は最新の Web 標準に合わせて進化し続けるため、変更によるこのテストの脆弱性を指摘しています。Salesforce は、ユーザが自動 UI テストから得られる価値と、ユーザにかかるメンテナンスの負荷を理解しています。
Lightning Web コンポーネントは、Web コンポーネント標準に基づいています。この標準には、コンポーネントのマークアップ、スタイル、動作を他のコンポーネントから見えないようにする Shadow DOM が含まれます。このカプセル化により、特に DOM をグローバル検索したり、カスタム要素の内部にアクセスしたりするテストの場合に UI テストが困難になります。
shadowRoot
プロパティは、要素の DOM サブツリーをカプセル化します。この shadowRoot
は、DOM で DocumentFragment
として表されます。この DOM サブツリー内の要素は従来の DOM クエリ方法では使用できません。Lightning Web コンポーネントで表示される要素には、この新しい shadowRoot
プロパティが含まれます。また、この要素は通常の DOM クエリでは非表示になっています。
Jest は、個々の Lightning Web コンポーネントの単体テストに使用することをお勧めします。
Selenium WebDriver などの UI テストツールは、エンドツーエンドテストにのみ使用してください。
Lightning Web コンポーネント用の単体テストを作成するには、sfdx-lwc-jest を使用します。
Jest テストコンテキストでは、コードで、テストする要素の shadowRoot
プロパティを使用してシャドウツリーにアクセスできます。shadowRoot
プロパティは要素のシャドウツリーをカプセル化します。
次のコードは、「例」セクションの <lightning-lwc-parent>
コンポーネントのシャドウツリーの <div>
にアクセスします。
エンドツーエンドの UI テストの場合は、Shadow DOM 用に既存のテストを調整します。テストの調整はツールごとに異なり、戦略は急速に進化しています。Selenium WebDriver の適切な例としてこの記事を参照することをお勧めします。
記事で説明されているように、WebDriver.findElement()
を使用したグローバルクエリは失敗します。Lightning Web コンポーネントのシャドウツリー内の要素を探すには、クライアント上で JavaScript を実行して、コンポーネントの shadowRoot
プロパティから照会します。
記事には、Chrome デベロッパーツールでの DOM 要素が表示されたスクリーンショットが含まれています。スクリーンショットには、#shadow-root
ドキュメントフラグメントが表示されています。これは、コンポーネントのシャドウツリーの最上位ノードです。Chrome デベロッパーツールで Lightning Web コンポーネントを表示する場合、LWC は Shadow DOM ポリフィルを使用するため、#shadow-root
は表示されません。Salesforce は、Shadow DOM Web 標準を実装していない一部のブラウザをサポートしています。これらのブラウザでは、ポリフィルによって Shadow DOM が提供されます。ページ上で Lightning Web コンポーネントを見つけるには、ハイフンを含む要素名を探します。要素を選択し、コンソールで $0.shadowRoot
を実行します。Lightning Web コンポーネントは #document-fragment
を返します。