1. ホーム
  2. xml

[解決済み] XPATHを使用して、&nbspを含むテキストを検索する。

2022-08-18 03:48:39

質問

私は XPather ブラウザ を使って、HTMLページ上でXPATH式をチェックしています。

私の最終的な目標は、ユーザーインターフェイスのテストにSeleniumでこれらの式を使用することです。

このような内容のHTMLファイルを入手しました。

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

文字列"を含むテキストを持つノードを選択したい。 &nbsp; という文字列を含むテキストを選択したいです。

"abc"のような通常の文字列では、問題はありません。 私は以下のようなXPATHを使用しています。 //td[text()="abc"] .

のようなXPATHで試してみると、以下のようになります。 //td[text()="&nbsp;"] のようなXPATHで試すと、何も返ってきません。 というテキストは特別なルールがあるのでしょうか? & というテキストには特別なルールがありますか?

どのように解決するのですか?

どうやら OpenQA は、Seleniumの背後にいる人々が、すでにこの問題に対処しているようです。 彼らは、ホワイトスペースを明示的にマッチさせるために、いくつかの変数を定義しました。 私の場合、次のようなXPATHを使用する必要があります。 //td[text()="${nbsp}"] .

この問題に関する OpenQA のテキストをここに転載します (見つかったのは はこちら ):

HTML は要素内の空白を自動的に正規化します。 要素内の空白を正規化し、先頭/末尾の空白を無視し を無視し、余分なスペースやタブ、改行を 余分なスペース、タブ、改行などは一つのスペースに変換されます。 を一つのスペースに変換します。Selenium がテキストを読み取るとき を読み出すとき、この挙動を再現しようとします。 この挙動を再現しようとします。 でのタブや改行をすべて無視することができます。 を無視してアサーションを行うことができます。 に基づいてアサーションを行うことができます。 レンダリングしたときにブラウザ上でテキストがどのように見えるかに基づいてアサーションを行うことができます。これを行うには、すべての 可視でない空白文字 (例えば を含む) を置き換えることで行います。 &nbsp; を含む)を を1つの空白に置き換えます。目に見えるすべての改行 ( <br> , <p> そして <pre> といったフォーマットされた の改行)は保存されるべきです。

に同じ正規化ロジックを使用します。 HTML Selenese テストケースのテキスト テーブルのテキストにも同じ正規化ロジックを使います。これには の利点があります。まず、ページの HTML ソースを見る必要がありません。 ページの HTML ソースを見る必要がありません。 アサーションがどのようなものであるべきかを判断するために であることです。 &nbsp; 記号はエンドユーザーには見えません。 エンドユーザーには見えません。 記号はエンドユーザーには見えないので、Selenese のテストを書くときに気にする必要はありません。 記号はエンドユーザーには見えないので、 Selenese のテストを書くときに気にする必要はありません。(あなたは をつける必要はありません。 &nbsp; というマーカーをテストケースに入れる必要はありません。 を含むフィールドに assertText するには " &nbsp; "を含むフィールドに assertText するようにします)。また、余計な を追加することもできます。 <td> タグに余計な改行や空白を入れてもかまいません。 テストケースの正規化ロジック に同じ正規化ロジックを使用しているので アサーションと抽出されたテキストが が正確に一致することを保証します。

これは、次のような場合にちょっとした問題を引き起こします。 このため、まれに 余分な空白を挿入したい場合 を挿入したい場合、ちょっとした問題が発生します。たとえば、次のような場合です。 フィールドにテキストを入力する必要があります。 のようなフィールドにテキストを入力する必要があります。 foo というように入力する必要があります。しかし、単に と書くと <td>foo </td> と書くだけなら を書くだけであれば を1つのスペースに置き換えます。

この問題には簡単な回避策があります。 Seleneseで変数を定義しています。 ${space} という変数を定義し、その値を という変数を定義しました。あなたは ${space} を使って 自動的に切り取られないスペースを挿入するには を挿入することができます。 <td>foo${space}${space}${space}</td> . また、変数 ${nbsp} という変数があり、これを使うと という変数があります。

XPathは ではなく を正規化しません。 を正規化しません。もし のようなXPathを書く必要がある場合 //div[text()="hello world"] のような XPath を書く必要があっても、リンクの リンクの HTML は本当に である。 hello&nbsp;world である場合、次のようにします。 を挿入してください。 &nbsp; を挿入する必要があります。 を挿入する必要があります。 このように //div[text()="hello${nbsp}world"] .