由于机器人框架中的String中的撇号而导致的Xpath表达式错误

时间:2017-05-17 19:08:59

标签: xpath robotframework dropdown

我在我的机器人框架脚本中遇到了以下错误。

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来识别并单击该元素。

元素是下拉列表。这是其中一个场景。我还有很多其他失败的场景。有人可以帮忙解决这个问题吗?

3 个答案:

答案 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中将单引号转换为字符串。

  1. 对字符串使用双引号。然后你可以在里面使用单引号(反之亦然)。

    //ul[@id='xyz-ul']/li[contains(text(),"Épargne en vue d'un objectif précis")]
    
  2. 如果不可行,就像在你的情况下一样,因为你永远不知道用户提供的值是否包含单引号或双引号,你必须使用concat() XPath函数,如下所示:

    //ul[@id='xyz-ul']/li[contains(text(), concat('Épargne en vue d', "'", 'un objectif précis'))]
    
  3. 第二个版本看起来很难,但实际上它可以通过拆分和连接输入字符串来可靠地构建,就像这样

    1. 输入字符串为Épargne en vue d'un objectif précis
    2. '分割得到Épargne en vue dun objectif précis
    3. 加入', "'", 'Épargne en vue d', "'", 'un objectif précis
    4. 使用concat('')进行换行,concat('Épargne en vue d', "'", 'un objectif précis')
    5. 这是您可以放入带有占位符的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')]