2015-09-24 11 views
7

Ho la seguente riga di codice utilizzato nello script selenio python:Come sfuggire apice singolo in XPath 1.0 di selenio per Python

from selenium import webdriver 

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

cat2 è variabile da un elenco di database che ottengo in questo modo:

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

il probleme è quando la variabile contiene un testo come questo:

cat2 = Debimetre d'air 

Poi lo script Non opere perché è un'espressione xpath illegale.

Dalla mia ricerca, ho capito che si tratta di un problema di sfuggire alla sola citazione nel mio cat2 variabile

Da queste risposte: Escape single quote in XPath with Nokogiri?

Essi suggeriscono di utilizzare concat() funzione XPath, ma come utilizzare nel mio caso? Grazie per il vostro aiuto.

Acclamazioni

+0

Hai provato questo - 'cat2 = DEBIMETRE d \ 'air'? –

+0

@GirishSortur, XPath ha un meccanismo di escape diverso. – Abel

+0

Ho già provato questo, ma come abel ha detto che xpath ha un diverso meccanismo di escape. – Andronaute

risposta

7

In XPath 1.0, che viene utilizzato dai browser e quindi per Selenio, non c'è modo di sfuggire nativo stringhe letterali (che è stato posto rimedio a XPath 2.0). Un few workarounds are mentioned by this poster, che comprende:

  • Prima di tutto, assicurarsi di aver compreso la differenza tra la fuga in Python, che è possibile, e fuggire all'interno dell'espressione XPath
  • Quindi, se avete bisogno semplicemente di una sola offerta, circondare con doppie virgolette e viceversa
  • Quindi, se un valore letterale di stringa contiene sia virgolette doppie che singole, utilizzare qualcosa come concat('"', "Here's Johnny", '"', ", said Johnny."), che combina il valore letterale: "Here's Johnny", said Johnny..

Nel vostro caso, questo dovrebbe funzionare:

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

Un altro modo per aggirare questo è quello di impostare una variabile di XPath per contenere il valore della vostra stringa letterale, che aiuta a migliorare la leggibilità. Ma non sono riuscito a trovare come farlo con i driver web per Selenium, che in genere significa che non esiste un tale metodo disponibile.

+0

Funziona perfettamente! Accettato Anwser. Grazie mille Able – Andronaute

+2

Ottima risposta! In effetti il ​​migliore che ho visto riguardo a questo problema, ben fatto. –

0

Ecco una funzione Python che ho appena scritto che sfugge una stringa da utilizzare in un'espressione XPath 1.0, utilizzando il trucco descritto nel @ risposta di Abel:

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 
Problemi correlati