【问题标题】:How to handle Apostrophes ( ' ) using XPATH in QTP如何在 QTP 中使用 XPATH 处理撇号(')
【发布时间】:2014-03-13 19:04:24
【问题描述】:

chk 这段代码 sn-p

请参考以下代码。

rv = “Are you 56' taller ?”

如果我通过 20 个字段,即直到 [rv = “ Are you 56' taller ? "]。 它不起作用,因为' - 撇号用于 QTP 中的注释

如何使用 QTP 在 Xpath 中处理 '(撇号)?

代码片段:

 rv = Replace (rv,"'", "\'")
 rv = LEFT(rv,50)

 If SVAL = "Yes" Then

 Set oobj = Browser("xyz").Page("abc").WebElement("xpath:=//div[contains(text(),'"& rv &"')]/../..//label[starts-with(text(),'Yes')]")
 oobj.Click
 oobj.Click

 i = i+1             

End If

非常感谢您的回复。

【问题讨论】:

    标签: string vbscript qtp apostrophe


    【解决方案1】:

    尝试使用character code chr(39) 作为撇号,如下所示:

     "Are you 56" & chr(39) & " taller ?"
    

    【讨论】:

    • 我不知道为什么这被否决了,这个解决方案实际上解决了问题(与之前的其他答案不同)。
    【解决方案2】:

    正如其他人所说,这不是因为' 是 vbscript 中的注释(不仅仅是 QTP),而是因为您过早地结束了字符串。

    您在 XPath 中对要比较的字符串使用单引号,然后撇号过早地关闭了字符串。您也应该在那里使用常规引号,以便撇号不会过早结束字符串。

    为了在 VBScript 中的字符串中获得双引号,请将其写入两次 "Like ""this"" for example"

    所以你的 XPath 应该是这样的:

    "//div[contains(text(),""Are you 56' taller ?"")]"
    

    而不是这样:

    "//div[contains(text(),'Are you 56' taller ?')]"
    

    或者使用你的例子:

    Browser("xyz").Page("abc").WebElement("xpath:=//div[contains(text(),"""& rv &""")]/../..//label[starts-with(text(),'Yes')]")
    

    (请注意,这已经过测试并且有效)

    【讨论】:

    • 感谢 Motti,很好的解释。另一点是,如果我使用这种方法,那么如何处理 txt 之间的空格。如果有多个问题的大文本。示例:阅读以下所有问题并回答是/否。如果任何一个答案为“否”,则选择“否” 1)您是否高于 56'2)您是否能够读、写和说西班牙语3)您是否可以通过以下方式上下班?你自己? 4)你住在城里吗 现在考虑上面的问题,由于空格不均匀,如何在 x 路径中传递此文本。非常感谢。
    • 我对 XPath 不是很熟悉,AFAIK 它不支持正则表达式,但是 QTP 的描述确实支持正则表达式,所以也许你应该使用正则描述(\s+ 匹配一个或多个空格或制表符) .
    【解决方案3】:

    使用' 而不是 (') 以便正确处理字符串。

    支持证据 -> click here.

    【讨论】:

      【解决方案4】:

      这与 ' 作为评论字符无关。这是正常的工作代码:

      Msgbox "'I love deadlines. I like the whooshing sound they make as they fly by.' Douglas Adams" 
      

      您的代码会导致错误,因为某些字符需要转义,例如 <>& 和臭名昭著的 '。要将上面的行正确输入到 XML 标记中,您需要这样做:

      htmlEscaped = "'I love deadlines. I like the whooshing sound they make as they fly by.&apos Douglas Adams"
      

      Here 你可以找到一组需要转义的最常见字符的概述(虽然这并不完全正确:如果你使用 Unicode/UTF-8 编码,一些字符会很好地解析)。

      不幸的是,VBScript 没有像用于 url 的 Escape 函数那样转义 HTML 的本机函数。仅当您在 ASP 服务器上时,您才能使用 Server.HtmlEncode,但您的情况并非如此

      要概括 html 转义(将所有内容视为特殊的,除了最常见的),您可以使用类似 this 的脚本:

      Function HTMLEncode(ByVal sVal)
      
          sReturn = ""
      
          If ((TypeName(sVal)="String") And (Not IsNull(sVal)) And (sVal<>"")) Then
      
              For i = 1 To Len(sVal)
      
                  ch = Mid(sVal, i, 1)
      
                  Set oRE = New RegExp : oRE.Pattern = "[ a-zA-Z0-9]"
      
                  If (Not oRE.Test(ch)) Then
                      ch = "&#" & Asc(ch) & ";"
                  End If
      
                  sReturn = sReturn & ch
      
                  Set oRE = Nothing
              Next
          End If
      
          HTMLEncode = sReturn
      End Function
      

      它可以改进一点(你会注意到将对象传递给这个函数会导致错误)并且更具体:正则表达式可以匹配更多的字符。我也不知道它的性能,正则表达式使用不当会很慢,但它证明了作为一个例子。

      【讨论】:

      • 此解决方案不能解决 OP 的问题,XPath 不适用于 HTML 编码。
      • @Motti 再次阅读问题后:你是对的。我认为 TS 会搜索这个:Set oobj = Browser("xyz").Page("abc").WebElement("xpath:=//div[contains(text(),"""&amp; rv &amp;""")]/../..//label[starts-with(text(),'Yes')]")。注意 ' 替换为 ""。编辑:没关系,您提供了相同的解决方案。投赞成票。
      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多