125

XPather Browserを使用して、HTML ページの XPATH 式をチェックしています。

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

次のような内容の HTML ファイルを取得しました。

<tr>
  <td>abc</td>
  <td> </td>
</tr>

文字列 " " を含むテキストを持つノードを選択したいと考えています&nbsp;

「abc」のような通常の文字列であれば問題ありません。に似た XPATH を使用し//td[text()="abc"]ます。

XPATH を試してみると、//td[text()="&nbsp;"]何も返されません。「 」を含むテキストに関する特別なルールはあり&ますか?

4

7 に答える 7

93

Selenium の背後にいるOpenQAは、すでにこの問題に対処しているようです。彼らは、空白に明示的に一致するようにいくつかの変数を定義しました。私の場合、のような XPATH を使用する必要があります//td[text()="${nbsp}"]

この問題に関する OpenQA のテキストをここに再現しました (ここにあります)。

HTML は要素内の空白を自動的に正規化し、先頭/末尾のスペースを無視し、余分なスペース、タブ、および改行を 1 つのスペースに変換します。Selenium がページからテキストを読み取るとき、この動作を複製しようとするため、HTML 内のすべてのタブと改行を無視し、レンダリング時にブラウザーでテキストがどのように見えるかに基づいてアサーションを行うことができます。これを行うには、すべての非表示の空白 (改行しないスペース " &nbsp;" を含む) を単一のスペースに置き換えます。表示されているすべての改行 ( <br><p>、および<pre>書式設定された改行) は保持する必要があります。

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

これは、テストケースに余分な空白を本当に挿入したい/挿入する必要があるまれな場合に、少し問題を引き起こします。たとえば、" foo " のようにフィールドにテキストを入力する必要がある場合があります。ただし、単に<td>foo </td>Selenese テスト ケースを記述した場合は、余分なスペースが 1 つのスペースに置き換えられます。

この問題には簡単な回避策があります。Selenese で ${space}、値が 1 つのスペースである変数を定義しました。${space}次のように、自動的にトリミングされないスペースを挿入する ために使用できます<td>foo${space}${space}${space}</td>${nbsp}改行しないスペースを挿入するために使用できる変数 も含まれています 。

XPath は、私たちのように空白を正規化しないことに注意してください。のような XPath を記述する必要がある //div[text()="hello world"]が、リンクの HTML が実際には " hello&nbsp;world" である場合は、Selenese テスト ケースに実際の " " を挿入して&nbsp;、次のように一致させる 必要があります//div[text()="hello${nbsp}world"]

于 2008-10-29T18:34:39.450 に答える
29

2 つの引用符の間に Windows で Alt+0160 を入力して、ハードコーディングされた改行なしのスペース (U+00A0) を入力すると、一致することがわかりました...

//table[@id='TableID']//td[text()=' ']

特別な文字で私のために働きました。

私が理解したことから、XPath 1.0 標準は Unicode 文字のエスケープを処理しません。XPath 2.0 にはそのための関数があるようですが、Firefox ではサポートされていないようです (または私が何かを誤解していました)。したがって、ローカルコードページを使用する必要があります。醜い、私は知っています。

実際、標準は、XPath を使用して正しい Unicode エスケープ シーケンスを提供するプログラミング言語に依存しているようです。

于 2008-10-29T16:09:14.983 に答える
5

&#160;名前付きエンティティの代わりに10進数エンティティを使用してみてください。それが機能しない場合は、エンティティ の代わりにノーブレークスペースにUnicode文字を使用できるはずです。&nbsp;

(注:これはXPatherでは試しませんでしたが、Oxygenでは試しました。)

于 2008-10-29T15:57:33.837 に答える
1

標準準拠の XML プロセッサは、XPath 式が評価されるまでに、 XML の 5 つの標準参照 ( &amp;&gt;&lt;、) 以外のエンティティ参照を、ターゲット エンコーディングの対応する文字に置き換えていることに注意してください。その動作を考えると、XML ツールを使用したい場合は、PhiLho と jsulak の提案が最適です。XPath 式を入力する場合、XPath 式が適用される前に、対応するバイト シーケンスに変換する必要があります。&apos;&quot;&#160;

于 2008-10-29T19:27:59.310 に答える
0

Xpather を使用して一致を取得することはできませんが、Microsoft の XML メモ帳でプレーンな XML ファイルと XSL ファイルを使用すると、次のように動作しました。

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

返される値は 1 です。これは、私のテスト ケースでは正しい値です。

ただし、以下を使用して、 nbspを XML および XSL 内のエンティティとして宣言する必要がありました。

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

参考になるかわかりませんが、実際にXPath 式を使用してnbspを見つけることができました。

編集:私のコードサンプルには実際に文字「 」が含まれています しかし、JavaScript シンタックス ハイライトはそれをスペース文字に変換します。誤解しないでください!

于 2008-10-29T17:12:35.933 に答える
0

&nbsp;またはのみを検索nbsp- これを試しましたか?

于 2008-10-29T15:05:47.453 に答える