私のWebページには、div
という名前のclass
があるTest
があります。
XPath
でどのように見つけることができますか?
このセレクターは機能するはずですが、適切なマークアップに置き換えるとより効率的になります。
//*[contains(@class, 'Test')]
または、求められている要素がdiv
であることがわかっているので、
//div[contains(@class, 'Test')]
しかしこれはclass="Testvalue"
やclass="newTest"
のような場合にもマッチするので、コメントで提供されている@ Tomalakのバージョンはより良い:
//div[contains(concat(' ', @class, ' '), ' Test ')]
それが正しく一致することを本当に確かめたいのであれば、クラス名のまわりの不要な空白文字をきれいにするためにnormalize-space関数を使うこともできます(@Terryで述べられているように)。
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
これらすべてのバージョンで、与えられた条件で文書内のすべての要素を検索したいのでなければ、*は実際に一致させたい要素名に置き換えてください。
最も簡単な方法.
//div[@class="Test"]
説明どおりに<div class="Test">
を見つけたいとします。
Tomalakがずっと以前にmederの回答へのコメントとして提供していたように、私はただ回答としてこれを提供しています。
//div[contains(concat(' ', @class, ' '), ' Test ')]
XPathでそれを行う正しい方法ONLY:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
関数normalize-space
は、先頭と末尾の空白を取り除き、空白文字のシーケンスを単一の空白で置き換えます。
これらのXpathクエリをあまり必要としないのであれば、CSSセレクタは通常XPathクエリよりも読み書き両方が簡単なので、CSSセレクタをXPathに変換するライブラリを使用することをお勧めします。たとえば、この場合、同じ結果を得るためにdiv[class~="foo"]
とdiv.foo
の両方を使用できます。
私が見つけることができたいくつかのライブラリ:
前の答えから役に立つ機能を作ることができます。
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
その後、関数呼び出しをクエリに連結してください。