Как избежать одинарной кавычки в xpath 1.0 в selenium для python

у меня есть следующая строка кода, используемая в скрипте selenium python:

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]

проблема в том, что переменная содержит такой текст:

cat2 = Debimetre d'air

тогда скрипт не работает, потому что это незаконное выражение xpath.

из моего поиска я понимаю, что это проблема с избеганием одиночной кавычки в моей переменной cat2

из этого ответа :побег одной цитаты в XPath с Nokogiri?

Они предлагают использовать функцию concat () xpath, но как ее использовать в моем случае ? Спасибо за помощь.

Ура

2 ответов


В XPath 1.0, который используется браузерами и, следовательно, Selenium, нет собственного способа экранирования строковых литералов (который был исправлен в XPath 2.0). А немногие обходные пути упомянуты этим плакатом, который включает в себя:

  • во-первых, убедитесь, что вы понимаете разницу между экранированием в Python, что возможно, и экранированием в выражении XPath
  • затем, если вам просто нужна одна цитата, окружите ее двойными кавычками и наоборот!--9-->
  • тогда, если один строковый литерал содержит как двойные, так и одинарные кавычки, используйте что-то вроде concat('"', "Here's Johnny", '"', ", said Johnny."), который объединяет в литерал:"Here's Johnny", said Johnny..

в вашем случае, это будет работать:

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

другой способ обойти это-установить переменную XPath, чтобы содержать значение вашего строкового литерала, что помогает в удобочитаемости. Но я не мог найти, как это сделать с веб-драйверами для Selenium, что обычно означает, что такого метода нет доступный.


вот функция Python, которую я только что написал, которая избегает строки для использования в выражении XPath 1.0, используя трюк, описанный в ответе @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