如何使用 XPath 查找标题中包含单引号和双引号的元素?

How can I use XPath to find an element with a title that contains single and double quotes?

我有一些 Python/Selenium 代码使用 XPath 查找具有指定标题文本的元素:

tab_element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//a[@title="' + tab_title + '"]'))

在大多数情况下它工作正常,但当它遇到标题包含双引号的元素时会失败。

<p title="that'll be the &quot;dayg&quot;">That'll be the "day"</p>

所以,我有两个问题:

  1. 如何让它与包含双引号的标题值一起使用?

  2. 如何让它与任何标题值一起使用,例如同时包含双引号和单引号的标题值?

我最终使用了来自 的 Elias 的 XPath 转义函数。

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

escaped_title = escape_string_for_xpath('"that\'ll be the "day"')

driver.find_element_by_xpath('//a[@title=' + escaped_title + ']')

对于 XPath 1.0,规则是:

(a) 字符串文字不能包含用作字符串分隔符的标记;唯一的解决方法是使用 concat() 形成字符串,例如 concat("'", '"', "'") 是三个字符的字符串 '"'.

(b) 如果字符串文字包含在宿主语言中具有特殊含义的字符(例如 Java 中的 " 或 XML 中的 &),则它需要使用宿主语言转义约定(Java中的\",XML中的&amp;)进行转义。

在 XPath 2.0 中,您可以通过加倍绕过 (a):例如,"""" 是一个字符串文字,表示包含双引号字符的长度为 1 的字符串。您还可以使用 codepoints-to-string() 函数绕过 (a) 和 (b)。