Как избежать одинарной кавычки в 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