2014-03-12 9 views
1

CHK这段代码如何处理单引号(')使用XPATH在QTP

请参考下面的代码。

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 

我真的很感谢你的回复。

回答

0

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

佐证 - >click here.

3

character codechr(39)的撇号尝试,如下图所示:

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

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

+1

我不知道为什么会这样这个解决方案实际上解决了这个问题(与之前的其他答案不同)。 – Motti

+0

@Motti我的错误。我已经撤消了。 – AutomatedChaos

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没有一个原生函数可以转义HTML,就像url的Escape函数。只有当你的ASP服务器上,您可以使用Server.HtmlEncode但就是不跟你

的情况下推广HTML逃逸(treath一切特殊,除了最公地),您可以使用脚本像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 

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

+0

此解决方案不解决OP的问题,XPath不适用于HTML编码。 – Motti

+0

@Motti再次阅读问题:你说得对。我认为TS搜索这个:'Set oobj = Browser(“xyz”)。Page(“abc”)。WebElement(“xpath:= // div [contains(text(),”“”&rv&“” )] /../..//标签[开始,用(文字(), '是')“)'。注意用'“”'代替''''。编辑:没关系,你提供了相同的解决方案。有一个upvote。 – AutomatedChaos

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')]") 

(注意这已经过测试和工程)

+0

感谢Motti,非常好的解释。另一点是,如果我正在使用这种方法,那么如何处理txt之间的空格也是如此。如果存在大量带有多个问题的文本。例如:阅读以下所有问题并回答是/否。如果有任何答案为否,则选择否<5个字符空格> 1)您是否高于56'2)您是否能够阅读,写作和说西班牙语<7个字符空间> 3)您是否可以通勤工作你自己? <6个字符空间> 4)你是否住在城镇现在考虑上述问题,如何在x路径中传递此文本,因为存在不均匀的空间。非常感谢。 – user3411743

+0

我对XPath不是很熟悉,AFAIK它不支持正则表达式,但是QTP的描述确实支持正则表达式,因此您应该使用常规描述('\ s +'匹配一个或多个空格或制表符)。 – Motti