0

Selenium (v 2.3) テストの機能をセットアップして、特定のエラー メッセージの存在をチェックしました。これは、チェックしている要素に頭字語が含まれるまで完全に機能していました。

div私の関数はページ内のすべてのエラーを取得し、それから期待されるメッセージを検索します。

# el is the error div element
error_el = el.find_element_by_xpath('p[contains(text(), "{0}")]'.format(error_text))
...
self.assertIsNotNone(error_el) # make sure it actually found something

テストからこれを呼び出していますが、頭字語が含まれるself.assertFieldError('My error message')までは完全に機能します。'My error message'頭字語が存在する場合、Selenium は私の文字列を段落に一致させません。

これに対する私の現在の解決策は、ページのソースで文字列を確認することですが、文字列が複数回出現する場合、これは理想的ではありません。

頭字語タグを無視するか、テキストまたは頭字語を含むテキストを許可するように xpath を改善することはできますか? 私は常に、text()メソッドはユーザーが見ているとおりに動作し、自動的に頭字語を無視すると想定していました。

編集

エラーメッセージは、フィールド名を介してDjangoフォームからフィールドラベルを取得するJavascriptを使用してフィールドに添付されます。私が知る限り、これは Selenium とは関係ありませんが。

HTML:

<div class="field">
    <div class="error">
        <p>My <acronym title="Error">ERR</acronym> message</p>
    </div>
    <label for="id_myField">My <acronym title="Error">ERR</acronym> message</label>
    <input id="id_myField" type="text">
</div>
4

1 に答える 1

3

text()の動作と、要素ノードを文字列値に変換する動作を混同していると思います。<p>のように、テキストを持つ子要素がある場合に違いが現れます<acronym>

text()個々のテキストノードを選択することです。明示的な名前空間軸がない場合、コンテキスト ノードの子であるテキスト ノードが選択されます。内部p[...]では、コンテキスト ノードは<p>要素です。したがってtext()、その述語の内部では、コンテキスト ノードの子 (孫ではない) であるノードのみが選択されます。あなたの例では、<p>要素には 3 つの子ノードがあります。

  • テキストノード"My "
  • 名前付き要素ノードacronym
  • テキストノード" message"

したがって、text()(要素のコンテキストでは) は、値がとpである 2 つのテキスト ノードのノードセットを返します。Mymessage

のように文字列として評価される場合contains(text(), ...)、ノードセットは次のように処理されます。最初のノードの文字列値が返され、残りは無視されます。したがって、あなたの例では、によって返されるノードセットは、つまり最初の子テキストノードのコンテンツにtext()評価されます。XPath 式は、一致させようとしている と同等"My "です。もちろん、それは失敗します。述語が false であるため、要素は返されません。p[contains("My ", "My error message")]pp

すべての子孫テキスト ノードの文字列コンテンツを連結したかったのですが、そうでtext()はありません。それを取得するには、<p>要素自体を文字列として評価します。例えば

p[contains(., "...")]

.はコンテキストノードを意味し、その中p[...]p要素があります。要素を文字列として評価するpと、結果はすべての子孫テキスト ノードの連結になります。

于 2013-04-03T14:19:50.577 に答える