2013-01-15 60 views
0

我一直在一段時間內運行自動測試,除此之外,圍繞電子郵件驗證的一系列測試一直在失敗。我發現的問題是由於發生了JavaScript錯誤,導致Selenium無法在XPath中的文本中搜索'@'。通過XPath搜索帶有符號的文本

我遇到了這個SO Question,很好地向我證實,通過Selenium中的XPath,字符不能在文本內搜索。

我的問題是,有沒有人找到解決辦法?

例如,我想能夠找到下面的文本字段中的元素:

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

而且我目前的XPath(顯然不會與符號的存在工作)拋出一個JavaScript錯誤的是(ERRORTEXT只是上面的字符串):

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

而只是爲了好玩,如果JavaScript錯誤幫助:

[14/01/2013 - 14:35:00.1820111] : InvalidSelectorError: Unable to locate an element with the xpath expression //*[contains(text(), '[email protected]@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 Question,但這樣做還是引起了JavaScript錯誤上面扔。我仍然覺得@符號是這裏的問題,可以看到沒有明顯的方式通過包括它的文本進行搜索。

回答

1

的@符號是不是這裏的問題,這是一個紅鯡魚的問題是,你的errorText值包含單引號,所以造成了XPath,拼接之後,(縮寫爲清楚起見):

//*[contains(text(), '[email protected] ... separator '@' is ... address.') 

正如你所看到的, @之前的'正在結束字符串文字,下一個之後的字符是@,這就是爲什麼錯誤是抱怨@不應該在那裏。如果errorMessage改爲包含'hello',則錯誤消息可能會抱怨h

對此的潛在解決方法是將text()和源值中的所有單引號替換爲其他字符或在比較過程中將其刪除。用雙引號替換它們可能是一個明智的選擇:

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

或比較期間除去單引號:

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

你能不能給一個嘗試?

+0

我還沒有嘗試刪除@中的引號,我會在我到達另一臺機器時試試這個,謝謝! – Nashibukasan

+0

你的代碼示例對我有很大的幫助,我喜歡XPath在字符串上執行方法在嘗試匹配之前。非常感謝! – Nashibukasan

1

你問題與@絕對無關,但是評價者「如何在XPAth中逃避單引號」。

您的XPath看起來像​​。可以很容易地看到,要搜索的字符串是無效的,因爲它由兩部分組成,在中間部分與@相結合,這在XPath中沒有意義。

修復:正確地轉義所有字符以避免在構建帶有字符串連接的XPath時的「SQL注入」 - 在Special Character in XPATH Query中涵蓋。在你的情況外雙引號應該是足夠的(如樣品字符串不包含單人和雙人quetes的搭配,否則 - 看樣品中的鏈接的問題,並建立完整的搜索字符串concat功能:

"...contains(text(), \"'foo'@'bar'\")... 
+0

我已經刪除了我以前的評論,因爲當我使用測試字符串時,我鏈接到的問題也解決了我的問題,但實際輸入字符串在由'''由@符號包圍時仍然失敗。 – Nashibukasan