0

しばらくの間、ビルドとは別に自動テストを実行してきましたが、電子メールの検証に関する一連のテストが失敗し続けました。私が見つけた問題は、Selenium が XPath 内のテキストで「@」を検索できないことを説明する javascript エラーがスローされるためです。

このSO Questionに遭遇しました。これは、標準として Selenium の XPath を介してテキスト内で文字を検索できないことをうまく確認しました。

私の質問は、誰かがこれを回避する方法を見つけましたか?

たとえば、次のテキスト フィールドを持つ要素を検索できるようにしたいと考えています。

<h1>"personA@email.com.au.personB@email.com.au - The separator '@' is either in an invalid position or is missing from the address."</h1>

そして、JavaScriptエラーをスローする私の現在のXPath(明らかにシンボルの存在では機能しません)は次のとおりです(ここで、errorTextは上記の文字列です):

"//*[contains(text(), '" + errorText + "')]"

楽しみのために、javascriptエラーが役立つ場合:

[14/01/2013 -  14:35:00.1820111]    :    InvalidSelectorError: Unable to locate an element with the xpath expression //*[contains(text(), 'personA@email.com.au.personB@email.com.au - The separator '@' is either in an invalid position or is missing from the address.')] because of the following error:
Error: Bad token: @

[編集]

入力テキストを二重引用符で囲む必要があることを示唆するSOの質問を調べましたが、これを行うと上記のjavascriptエラーがスローされます。ここでは@記号が問題であり、それを含むテキストを介して検索する明確な方法が見当たらないという印象を受けています。

4

2 に答える 2

1

ここでは、@記号は問題ではありません。赤いニシンです。問題は、errorText値に一重引用符が含まれているため、連結後の結果のXPathは次のようになります(わかりやすくするために省略形)。

//*[contains(text(), 'personA@Email ... separator '@' is ... address.')

ご覧のとおり、'@は文字列リテラルを終了し、その後の次の文字はです。そのため、エラーは本来あるべきではない場所にあること@について不平を言っています。代わりにが含まれている@場合、エラーメッセージはおそらく。について文句を言うでしょう。errorMessage'hello'h

これに対する潜在的な回避策は、text()とソース値の両方のすべての一重引用符を他の文字に置き換えるか、比較中にそれらを削除することです。それらを二重引用符で置き換えることは賢明な選択かもしれません:

"//*[contains(translate(text(), \"'\", '\"'), '" + errorText.replace("'", '"') + "')]"

または、比較中に一重引用符を削除するには:

"//*[contains(translate(text(), \"'\", ''), '" + errorText.replace("'", '') + "')]"

試していただけませんか?

于 2013-01-16T09:43:27.103 に答える
1

あなたの問題は@とはまったく関係ありませんが、「XPathで一重引用符/二重引用符をエスケープする方法」を評価しています。

XPath は のようになり...contains(text(),'foo'@'bar')...ます。検索する文字列は、途中で @ で結合された 2 つの部分で構成されているため、無効であることが簡単にわかりますが、これは XPath では意味がありません。

修正: 文字列連結を使用して XPath を構築するときに、「SQL インジェクション」と同等のものを回避するために、すべての文字を適切にエスケープします - XPATH クエリの特殊文字で説明されています。あなたの場合、外側の二重引用符で十分です(サンプル文字列には単一および二重のクエリが混在していないためです。それ以外の場合は、リンクされた質問のサンプルを見て、関数を使用して完全な検索文字列を作成しconcatます:

"...contains(text(), \"'foo'@'bar'\")...
于 2013-01-15T21:59:14.880 に答える