我在我的机器人框架脚本中遇到了以下错误。
InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression //ul[@id='xyz-ul']/li[contains(text(),'Épargne en vue d\'un objectif précis')] because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//ul[@id='xyzul']/li[contains(text(),'Épargne en vue d\'un objectif précis')]' is not a valid XPath expression.
我正在尝试从excel中获取法语数据"Épargne en vue d'un objectif précis"
并传入xpath来识别并单击该元素。
元素是下拉列表。这是其中一个场景。我还有很多其他失败的场景。有人可以帮忙解决这个问题吗?
答案 0 :(得分:3)
XPath没有转义序列。
//ul[@id='xyz-ul']/li[contains(text(),'Épargne en vue d\'un objectif précis')]
和
一样无效//ul[@id='xyz-ul']/li[contains(text(),'Épargne en vue d'un objectif précis')]
会是。
如果你可以减轻这个错误或者你运气不好,这取决于具体情况。
在测试框架的上下文中,您可能很不幸,但是您需要显示更多代码才能获得更好的答案。
有两种方法可以在XPath中将单引号转换为字符串。
对字符串使用双引号。然后你可以在里面使用单引号(反之亦然)。
//ul[@id='xyz-ul']/li[contains(text(),"Épargne en vue d'un objectif précis")]
如果不可行,就像在你的情况下一样,因为你永远不知道用户提供的值是否包含单引号或双引号,你必须使用concat()
XPath函数,如下所示:
//ul[@id='xyz-ul']/li[contains(text(), concat('Épargne en vue d', "'", 'un objectif précis'))]
第二个版本看起来很难,但实际上它可以通过拆分和连接输入字符串来可靠地构建,就像这样
Épargne en vue d'un objectif précis
'
分割得到Épargne en vue d
和un objectif précis
', "'", '
会Épargne en vue d', "'", 'un objectif précis
concat('
和')
进行换行,concat('Épargne en vue d', "'", 'un objectif précis')
,这是您可以放入带有占位符的XPath表达式的字符串,如下所示:
${dropdown_selection_first_part_xpath} = //ul[@id='xyz-ul']/li[contains(text(),
${dropdown_selection_second_part_xpath} = )]
${dropdown_xpath} = //div[@id='xyz-widget']/div/div[2]/div[1]
${escaped_input_purpose_of_account} = (somehow to the 4 steps above)
${dropdown_selection_xpath} = catenate SEPARATOR= ${dropdown_selection_first_part_xpath} ${escaped_input_purpose_of_account} ${dropdown_selection_second_part_xpath}
这种方法适用于所有输入(空字符串,没有引号的字符串,带有任何单引号和双引号混合的字符串),并始终创建符合预期的语法上有效的XPath。
答案 1 :(得分:1)
正如在另一个答案中正确地说的那样,xpath中没有引号逃脱。您可以采取的措施是使用相反的引号类型来包围文本字符串。
所以对于问题中的样本,这个 - 双引号 - 应该这样做:
//ul[@id='xyz-ul']/li[contains(text(),"Épargne en vue d'un objectif précis")]
现在,您的一些测试字符串可能有单引号,其他 - 双倍。下面是一个示例代码,如何构造正确的一个定位器,每个案例:
${dropdown_selection_first_part_xpath} = //ul[@id='xyz-ul']/li[contains(text(), # no quote symbol
${dropdown_selection_second_part_xpath} = )] # no symbol here also
${dropdown_xpath} = //div[@id='xyz-widget']/div/div[2]/div[1]
# "Get Value" omitted for brevity, no change in it
Enter Value
click element xpath=${dropdown_xpath}
${input}= Get Value ${language}
# put the surrounding quotes based on the string's content - double quotes if it has a single one, single otherwise
${input}= Set Variable If "'" in """${input}""" "${input}" '${input}'
${dropdown_selection_xpath}= catenate SEPARATOR= ${dropdown_selection_first_part_xpath} ${input} ${dropdown_selection_second_part_xpath}
click element xpath=${dropdown_selection_xpath}
最后,如果你有包含单引号和双引号的测试字符串 - 它会更复杂,但仍然可行。
答案 2 :(得分:0)
我没有对此进行测试,但您可以尝试:
//ul[@id='xyz-ul']/li[contains(text(),'Épargne en vue d'un objectif précis')]