如何在QTP中使用XPATH处理Apostrophes(')

时间:2014-03-12 16:48:59

标签: string vbscript qtp apostrophe

请参阅此代码段

请参阅以下代码。

rv = “Are you 56' taller ?”

如果我传递20个字段,即直到[rv = “ Are you 56' taller ? "]。 它不起作用,因为' - 撇号用于在QTP中发表评论

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

代码段:

 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

我非常感谢你的回复。

4 个答案:

答案 0 :(得分:3)

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

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

Msgbox in QTP showing the "Are you 56' taller"

答案 1 :(得分:1)

正如其他人所说,这不是因为'是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')]")

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

答案 2 :(得分:0)

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

支持证据 - > click here.

答案 3 :(得分:0)

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

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

您的代码会导致错误,因为某些字符需要像<>&以及您臭名昭着的'一样进行转义。要将上面的行正确输入XML标记,您需要执行以下操作:

htmlEscaped = "&apos;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

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