用語集 · 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でカバーでき、読みやすさも上です。