51Testing软件测试论坛

标题: 当变量的值中出现括号时会出错,该怎么办 [打印本页]

作者: gzj_06    时间: 2007-7-24 12:26
标题: 当变量的值中出现括号时会出错,该怎么办
我录制的脚本中有这样一句代码:Browser("视频 - 土豆网 - 播客 个人多媒体").Page("视频 - 土豆网 - 播客 个人多媒体").Link("Text:= " & innerText(32)).click,其中innerText()是一数组变量,是已经取得的链接的innerText属性,innerText(32)="放羊的星星第20集(1)",值中含有括号,运行到这句时就会出错,报的错是不能识别这个Link对象,而当换个其它的元素,值中不含有括号时,就不会出错,碰到这种情况我该怎么办呢,谢谢!
作者: 风过无息    时间: 2007-7-24 12:51
innerText(32)="放羊的星星第20集\(1\)",
作者: jackymail    时间: 2007-7-24 13:33
标题: 帮助文档里面有
在descriptive programming.see progra....
里面的第2页第一个黄色部分note:
qtp使用正则表达式的方式在描述性编程中评测处理所有的属性值
楼上厉害啊,我还以为是innertext\(34\)呢。。

[ 本帖最后由 jackymail 于 2007-7-24 13:38 编辑 ]
作者: gzj_06    时间: 2007-7-24 13:50
谢谢楼上两位,我将语句改成下面的是可以回放的
Dim a
a="放羊的星星第20集\(1\)"
Browser("视频 - 土豆网 - 播客 个人多媒体").Page("视频 - 土豆网 - 播客 个人多媒体").Link("Text:= " & a).click

但现在问题是我不知道a的值里有没有括号,要加个判断,如果有括号,则在括号前加\,这样的语句该怎么写呢,谢谢!
作者: gzj_06    时间: 2007-7-24 13:56
貌似是用Replace函数是吧,正在研究,有什么好方法,请多多指教!
作者: jackymail    时间: 2007-7-24 13:59
标题: replace
呵呵,自问自答阿。那我还是删了自己的话吧。。。
作者: lantianwei    时间: 2007-7-24 14:02
如果这个()是在字符串的最后那就方便些,你可以用RIGHT()函数取右边3个字符,再判断有没有带(,),有的话就加个“\”。如果()是在任意位置,那就麻烦一点,你先要匹配字符串,找到()的位置再进行替换,会麻烦一点!呵呵。。。。不知道能不能帮助你。sdlkfj5
作者: gzj_06    时间: 2007-7-24 14:13
  1. Dim a
  2. a="放羊的星星第20集(1)"
  3. b=replace(a, "(", "\(")
  4. c=replace(b, ")", "\)")
  5. msgbox c
复制代码
这个方法貌似有点麻烦,因为为了防止有中文输入法下的括号,还得再加两个replace函数,哪位有什么更好的方法吗
作者: jackymail    时间: 2007-7-24 14:23
标题: 中文的()好像不算特殊字符
就不用加转义字符。估计是这样的。
作者: gzj_06    时间: 2007-7-24 14:42
原帖由 jackymail 于 2007-7-24 14:23 发表
就不用加转义字符。估计是这样的。
不行的,我已经试过了,但圆括号貌似也并未用于正则表达式
作者: jackymail    时间: 2007-7-24 14:46
标题: ( )
你有没有script56那个vbscript教程,那里里面有正则表达式的描述,你没有我可以给你一个
那个是我见过得比较好的vbscript的chm
还有你的问题多用几次replace也没什么问题,估计没有更好的函数,等我有空或许会写一个,哈哈。

$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[  标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
作者: gzj_06    时间: 2007-7-24 15:00
标题: 回复 #11 jackymail 的帖子
是都包含在windows脚本技术里的那个吧,那个我也有的,but 3Q just the same
作者: gzj_06    时间: 2007-7-24 15:23
要是可以这样就好了:
if innerText(i)有特殊字符 then
   在前面加\
end if
作者: Jimmyshao    时间: 2007-7-24 16:48
最后加个.*
作者: gzj_06    时间: 2007-7-24 17:48
原帖由 Jimmyshao 于 2007-7-24 16:48 发表
最后加个.*
不太明白你的意思,帮忙看看我的代码,看看究竟如何改
  1. Function newString (myString)
  2.         myString = replace(myString, "(", "\(")
  3.         myString = replace(myString, ")", "\)")
  4.         myString = replace(myString, "(", "\(")
  5.         myString = replace(myString, ")", "\)")
  6.         myString = replace(myString, "[", "\[")
  7.         myString = replace(myString, "]", "\]")
  8.         myString = replace(myString, "+", "\+")
  9.         myString = replace(myString, ".", "\.")
  10.         newString = myString
  11. End Function
复制代码

作者: Jimmyshao    时间: 2007-7-24 20:42
我的意思是你的这个值-〉放羊的星星第20集(1)
是从Excel中取出来的吗?
如果是的,就在Excel中写成-〉放羊的星星第20集.*
然后在指向这个字段的属性中把正则表达式的勾给勾上...
作者: skyzhu    时间: 2007-7-25 11:29
标题: LZ拿去试试
Function newstring(mystring)
        Dim specialstring,stringcount
        specialstring = "\,$,(,),*,+,.,[,],?,^,{,},|"   '自己加,"\"放第1个
        stringcount = Int(Len(specialstring)/2)
        specialstring = Split(specialstring,",",-1,1)
        For i = 0 To stringcount
                myString = Replace(myString, specialstring(i), "\"& specialstring(i))
        Next
        newString = myString
End Function
作者: jackymail    时间: 2007-7-25 11:40
标题: 楼上写得真是好啊
一个里面可能包含多个特殊字符都考虑到了。
作者: gzj_06    时间: 2007-7-25 12:05
原帖由 Jimmyshao 于 2007-7-24 20:42 发表
我的意思是你的这个值-〉放羊的星星第20集(1)
是从Excel中取出来的吗?
如果是的,就在Excel中写成-〉放羊的星星第20集.*
然后在指向这个字段的属性中把正则表达式的勾给勾上...
不是从Excel里读取的,而是从网页上动态获得的,是将网页中所有链接的innertext属性获取到,然后全部存放到innerText()数组中的
作者: gzj_06    时间: 2007-7-25 12:09
标题: 回复 #17 skyzhu 的帖子
对啊,用循环,太感谢了!
不过不知什么原因,我用了这个Function后,QTP跑到一半,就跑不下去了,也不报错,CPU也一下子满了,100%了
作者: gzj_06    时间: 2007-7-25 14:48
出现错误的情况找出来了,我的调用语句是在循环里的,即:
For i = 0 to objectcount
   innerText(i) = newString (innerText(i))     '调用newString函数
Next
当执行到调用函数语句时,就去调用Function newString (myString),第一次循环执行的结果是innertext(0)="放羊的星星第20集\(1\)",这是没问题的,但当执行第二次循环时,问题就出现了,按道理myString的值应该变为innertext(1)的值,但奇怪的是没变,仍然是innertext(0)的值,即"放羊的星星第20集\(1\)",第2次循环后innertext(1)的值没变,仍为"放羊的星星第20集(2)",而innertext(0)的值却变为"放羊的星星第20集\\\(1\\\)",请问哪位高手,这到底是怎么回事

[ 本帖最后由 gzj_06 于 2007-7-25 14:52 编辑 ]
作者: gzj_06    时间: 2007-7-25 15:22
貌似是与Function中参数传递的方式有关的,不知默认是哪种,是ByVal还是ByRef,但奇怪的是我之前用的Function不是没有出现这个问题吗

P.S. 我之前用的Function见15#
作者: jackymail    时间: 2007-7-25 15:24
标题: 能否把全部代码贴出来看看
帮你debug一下
作者: gzj_06    时间: 2007-7-25 15:53
标题: 回复 #23 jackymail 的帖子
谢谢,问题已解决,原来是在两段循环中同时用了i这个变量导致的
  1. For i=0 to objectCount
  2.         If innerText(i)=" " Then
  3.                 innerText(i + 1) = newString (innerText(i + 1))                '调用newString函数
  4.         End If
  5. Next

  6. Function newString(myString)
  7.         Dim specialstring,stringcount
  8.         specialstring = "\,$,(,),*,+,.,[,],?,^,{,},|"   '自己加,"\"放第1个
  9.         stringcount = Int(Len(specialstring)/2)
  10.         specialstring = Split(specialstring,",",-1,1)
  11.         For i = 0 To stringcount
  12.                 myString = Replace(myString, specialstring(i), "\"& specialstring(i))
  13.         Next
  14.         newString = myString
  15. End Function
复制代码





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2