2015-09-24 52 views
7

我在硒的Python腳本中使用下面的代碼行:我得到這樣如何硒逃避單引號中的XPath 1.0蟒蛇

from selenium import webdriver 

driver.find_element_by_xpath(u"//span[text()='" + cat2 + "']").click() 

CAT2是從數據庫列表變量:

db = Database() 
sql = "SELECT * FROM missing 
listeproduit = db.select(sql) 
for record in listeproduit: 
    cat2  = record[6] 

的probleme是當變量包含這樣的文字:

cat2 = Debimetre d'air 

然後腳本不工作因爲這是一個非法的xpath表達式。

從我的搜索,我明白,這與逃逸的單引號在我的變量CAT2

從這個回答一個問題:Escape single quote in XPath with Nokogiri?

他們建議使用CONCAT()XPath函數,但如何使用它在我的情況? 感謝您的幫助。

乾杯

+0

你試試這個 - 'CAT2 = Debimetre d'空氣'? –

+0

@GirishSortur,XPath有一個不同的轉義機制。 – Abel

+0

我已經嘗試過,但作爲亞伯說xpath有一個不同的轉義機制。 – Andronaute

回答

7

在XPath 1.0,用於通過瀏覽器,因此由硒,有逸出字符串(這是XPath 2.0中糾正)的沒有本機方法。一個few workarounds are mentioned by this poster,其中包括:

  • 首先,確保你理解Python中,這是可能的逃逸和XPath表達式中逸出的區別
  • 然後,如果你只需要一個單引號,環繞它通過雙引號,反之亦然
  • 然後,如果一個字符串文字同時包含雙引號和單引號,請使用類似concat('"', "Here's Johnny", '"', ", said Johnny.")的文字:"Here's Johnny", said Johnny.

在你的情況,這會工作:

driver.find_element_by_xpath(u"//span[text()=\"" + cat2 + "\"]").click() 

解決這個另一種方式是設置一個XPath變量包含的字符串字面量,這有助於可讀性的價值。但是我無法找到如何使用Selenium的網絡驅動程序來執行此操作,這通常意味着不存在此類方法。

+0

完美的作品!安瑟接受。非常感謝Able – Andronaute

+2

很好的答案!事實上,我已經看到關於這個問題的最好的,做得很好。 –

0

這裏是一個Python函數我剛剛寫了逃跑的字符串在XPath 1.0表達式中使用,使用@亞伯的回答中描述的絕招:

def escape(s): 
    if '"' in s and "'" in s: 
     return 'concat(%s)' % ", '\"',".join('"%s"' % x for x in s.split('"')) 
    if '"' in s: 
     return "'%s'" % s 
    return '"%s"' % s