如何在selenium for python中的xpath 1.0中单引号

时间:2015-09-24 10:42:58

标签: python selenium xpath selenium-webdriver

我在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中转义单引号是个问题

从这个答案:Escape single quote in XPath with Nokogiri?

他们建议使用concat()xpath函数,但是如何在我的情况下使用它? 谢谢你的帮助。

干杯

2 个答案:

答案 0 :(得分:7)

在XPath 1.0中,由浏览器使用,因此由Selenium使用,没有本地方式转义字符串文字(在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的Web驱动程序,这通常意味着没有这样的方法。

答案 1 :(得分:0)

这是我刚刚编写的Python函数,它使用@ Abel的答案中描述的技巧转义在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