メインコンテンツへスキップ
SDETRole
SDETRole

用語集 · UI 自動化

XPath

別名: XPath 式, XPath expression, XPath expressions, XPath ロケーター

定義

XML や HTML 文書のノードを選択するためのクエリ言語で、UI 自動化では構造、属性、テキストによって要素を特定するのに使われます。

XPath(XML Path Language)は、文書ツリーをたどって目的のノードに至るパスを記述する言語です。テスト自動化ではロケーターの書き方の 1 つであり、CSS に対する主な利点は、テキストの内容で一致させられることと、どの方向にもたどれることです。親へ上る、兄弟要素へ横に移る、子孫へ下る、のいずれも可能です。ブラウザーが実装しているのは XPath 1.0 なので、matches() や lower-case() のような後続バージョンの関数は使えません。

例

//button[normalize-space()='Sign in']
//input[@name='email']
//label[text()='Password']/following-sibling::input
//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']
//a[contains(@href, '/invoices/')]

4 行目は、人々が XPath を使いたくなる理由を示しています。特定のセルを含むテーブル行を見つけ、その行の中にあるボタンを探す、というものです。

WebElement cancel = driver.findElement(
    By.xpath("//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']"));

絶対パスと相対パス

絶対 XPath はルートから始まり(/html/body/div[2]/form/button)、ラッパー要素が 1 つでも変わるとすぐに壊れます。相対 XPath は // で始まり、意味のある何かを起点にします。DevTools から「完全な XPath」をコピーすると絶対パスの形式になり、テストではまず使うべきではありません。

よくある間違い

  • (//div)[7] のようなインデックスベースのパス。 意味ではなくレイアウトを埋め込んでしまいます。
  • ネストしたマークアップを持つ要素への text()。 ラベルが子要素の <span> の中にあると、//button[text()='Save'] は失敗します。normalize-space()(または .)なら文字列値全体を使います。
  • @class='btn' でクラスを一致させる。 これは属性全体がちょうど btn の場合にしか一致しません。contains(concat(' ', normalize-space(@class), ' '), ' btn ') を使うか、CSS の .btn に切り替えましょう。
  • 習慣で XPath をデフォルトにする。 Playwright では、テキストベースのケースの大半を getByRole と getByText でカバーでき、読みやすさも上です。

キーワードを入力すると SDETRole 全体を検索できます。

Pagefind による全文検索 · ブラウザ内で動作します 検索ページを開く →