XPATH を使用して次の内容を含むテキストを検索する
質問
私が使う XPatherブラウザ HTML ページ上の XPATH 式をチェックします。
私の最終目標は、ユーザー インターフェイスのテストに Selenium でこれらの式を使用することです。
次のような内容の HTML ファイルを取得しました。
<tr> <td>abc</td> <td> </td> </tr>
文字列「」を含むテキストを持つノードを選択したいと考えています。
".
「abc」のような通常の文字列では問題ありません。次のような XPATH を使用します //td[text()="abc"]
.
次のようなXPATHを試してみると //td[text()=" "]
何も返しません。「」を含むテキストに関する特別なルールはありますか?&
" ?
解決
のようだ OpenQA, Selenium の背後にいる人たちは、すでにこの問題に取り組んでいます。彼らは、明示的に空白と一致するようにいくつかの変数を定義しました。私の場合、次のような XPATH を使用する必要があります。 //td[text()="${nbsp}"]
.
この問題に関する OpenQA のテキストをここに転載しました (見つかりました) ここ):
HTMLは、主要なスペースを無視し、余分なスペース、タブ、ニューラインを単一のスペースに変換し、要素内でホワイトスペースを自動的に正規化します。Seleniumがページからテキストを読み取ると、この動作を複製しようとするため、HTMLのすべてのタブとNewLinesを無視し、レンダリング時にブラウザのテキストの外観に基づいてアサーションを行うことができます。私たちは、すべての可視できない白人を置き換えることでこれを行います(壊れないスペースを含む」
")単一のスペースで。すべての目に見えるニューライン(<br>
,<p>
, 、 そして<pre>
フォーマットされた新しい行)を保存する必要があります。HTMLセレンのテストケーステーブルのテキストで同じ正規化ロジックを使用します。これには多くの利点があります。まず、ページのHTMLソースを調べて、アサーションがどうあるべきかを把握する必要はありません。」
「シンボルはエンドユーザーには見えないため、Seleneseテストを書くときに心配する必要はありません。(置く必要はありません」
「テストケースのマーカーが含まれているフィールドでのアサートテキストのマーカー」
"。)あなたはまた、あなたのセレンゼに余分な新しいラインとスペースを置くことができます<td>
タグ;テストの場合と同じ正規化ロジックをテストケースで使用するため、アサーションと抽出されたテキストが正確に一致するようにすることができます。これにより、テストケースに余分な空白を本当に挿入する/必要がある場合に、これらのまれな機会に少し問題が発生します。たとえば、次のようなフィールドにテキストを入力する必要がある場合があります。」
foo
」。しかし、単に書くなら<td>foo </td>
セレンのテストケースでは、余分なスペースを1つのスペースに置き換えます。この問題には簡単な回避策があります。Selenese で変数を定義しました。
${space}
, 、その価値は単一のスペースです。使用できます${space}
このように、自動的にトリミングされないスペースを挿入するには:<td>foo${space}${space}${space}</td>
。変数も含めました${nbsp}
, 、壊れないスペースを挿入するために使用できること。XPath は次のことを行うことに注意してください。 ない 私たちのやり方で白文学を正規化します。次のようなXPathを書く必要がある場合
//div[text()="hello world"]
しかし、リンクのHTMLは本当にです」hello world
「、本当のものを挿入する必要があります」
「このように、それを一致させるためにあなたのセレンのテストケースに://div[text()="hello${nbsp}world"]
.
他のヒント
Windowsで2つの引用符の間にAlt + 0160を入力すると、ハードコードされた改行なしスペース(U + 00A0)を入力したときに一致することができます...
//table[@id='TableID']//td[text()=' ']
特別な文字で私のために働いた。
私が理解したことから、XPath 1.0標準はUnicode文字のエスケープを処理しません。 XPath 2.0にはそのための関数があるように見えますが、Firefoxはそれをサポートしていないようです(または、私は何かを誤解しました)。そのため、ローカルコードページを使用する必要があります。 glyい、知っている。
実際、標準は正しいUnicodeエスケープシーケンスを提供するためにXPathを使用するプログラミング言語に依存しているように見えます...それで、どういうわけか、私は正しいことをしました。
名前付きエンティティの代わりに10進数エンティティ&amp;#160;
を使用してみてください。それが機能しない場合は、単に unicodeを使用できるはずです。 &amp; nbsp;
エンティティではなく、改行しないスペースの文字。
(注:XPatherではこれを試しませんでしたが、Oxygenでは試しました。)
標準に準拠したXMLプロセッサは、XMLの5つの標準参照(&amp; amp;
、&amp; gt;
、 &amp; lt;
、&amp; apos;
、&amp; quot;
)XPath式が終了するまでのターゲットエンコーディングの対応する文字評価した。その振る舞いを考えると、PhiLhoとjsulakの提案は、XMLツールを使用する場合の方法です。 XPath式に&amp;#160;
を入力する場合、XPath式が適用される前に、対応するバイトシーケンスに変換する必要があります。
Xpatherを使用して一致を取得することはできませんが、MicrosoftのXMLメモ帳でプレーンXMLおよびXSLファイルを使用して次のように機能しました。
<xsl:value-of select="count(//td[text()=' '])" />
返される値は1です。これは、テストケースでは正しい値です。
ただし、次を使用して nbsp をXMLおよびXSL内のエンティティとして宣言する必要がありました。
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
それがあなたに役立つかどうかはわかりませんが、XPath式を使用して nbsp を実際に 見つけることができました。
編集:私のコードサンプルには実際には文字 '&amp; nbsp;' が含まれていますが、JavaScript構文の強調表示によりスペース文字に変換されます。誤解しないでください!
&amp; nbsp;
または nbsp
のみを検索します-これを試しましたか?