51Testing软件测试论坛

标题: 如何参数化link [打印本页]

作者: lovetest6    时间: 2005-10-27 13:13
标题: 如何参数化link
有个朋友问
如何参数化link
大致意思是说,页面上有很多link
录的时候点一个link,回放的时候能够点很多link
即所谓"link的参数化":)

以我们的bbs为例,给出以下代码
  1. Browser("Browser").Page("Page").Sync
  2. Browser("Browser").Navigate "http://bbs.51testing.com/index.php"
  3. Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Sync

  4. Set tags=Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object.links
  5. Dim i,j, arr()
  6. i=0
  7. For Each element in tags
  8.     If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
  9. ReDim Preserve arr(i+1)
  10.      arr(i)=element.InnerText
  11.     i=i+1
  12. end if
  13. Next



  14. For j=0 to i
  15. Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").SetTOProperty "Text",arr(j)
  16.             Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").Click
  17. Browser("Browser").Back
  18. Next
复制代码

作者: lovetest6    时间: 2005-10-27 13:18
这段代码先是打开一个空的页面,然后输入url.
到达论坛首页。

然后得到所有版面的名称,也就是link的名称。
存到数组里面。
然后使用SetTOProperty更换录制时候录下的link的属性。
这时候再click
也就是
  1. Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").Click
复制代码
就可以了。

希望大家拍砖,完善这个脚本。:)

我完善的部分:
link上的文字不用存到datetable中,提高效率。
修改了object.all为object.links避免了判断页面中过多的tag.

[ Last edited by lovetest6 on 2005-10-27 at 13:20 ]
作者: up(51testing)    时间: 2005-11-3 11:23
标题: 为什么?
我Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object没有link这一属性
作者: up(51testing)    时间: 2005-11-3 11:36
标题: 为什么?
我Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object没有link这一属性
作者: lovedemon    时间: 2005-11-4 14:23
我有一个办法解决这个问题,可以通过更改link 控间属性值的方法达到这个目的,如进入界面后点击名位“7”的连接,录制成功后,更改link7的属性值中的text项,假设将其改为5,那么下次运行时就会点击5这个连接,并且可以对这个值进行参数化,点击多个连接
作者: lovedemon    时间: 2005-11-4 14:26
还有一个问题,就是如何达到一次登陆,点击多个连接的目的这个理论上可以使用call action来达到,一个action1负责登陆,一个负责点击action2,但是我遇到了问题就是无法控制action2进行重复循环希望楼主帮忙想办法,我已经将这个问题,单独作为一个问题,提交到坛子中
作者: zhengfeng    时间: 2005-11-10 18:00
不错,佩服.
作者: shengyan    时间: 2005-11-11 12:26
我来试一下
作者: shengyan    时间: 2005-11-12 09:24
斑竹错了,最后一个循环应该是
For j=0 to i-1
     ................                 
Next
作者: shengyan    时间: 2005-11-12 22:03
实现了lovedemon 的方法,献丑一下,大家看看还能怎么优化一下??
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://bbs.51testing.com/index.php"
Browser("Browser").Page("51Testing软件测试论坛 ---软件测试,软件质量工程").Sync
Dim arr
arr = Array("[软件质量管理]" ,"[软件需求管理]" )
Dim i
i = 0
For i=0 to 1
Browser("Browser").Page("51Testing软件测试论坛 ---软件测试,软件质量工程").Link("[软件测试论坛公告]").SetTOProperty "Text",arr(i)
Browser("Browser").Page("51Testing软件测试论坛 ---软件测试,软件质量工程").Link("[软件测试论坛公告]").Click
reporter.ReportEvent micPass,"click links",arr(i)
Browser("Browser").Page("51Testing软件测试论坛 - [软件测试论坛公告]--").Sync
Browser("Browser").Back
Next
Browser("Browser").Page("51Testing软件测试论坛 ---软件测试,软件质量工程").Sync
作者: walker1020    时间: 2006-9-5 17:14
这样的好帖子应该置顶!
作者: Joan2005    时间: 2006-10-10 10:09
收藏
作者: Joan2005    时间: 2006-10-10 21:24
下面是我录制的脚本,我有2点疑问.
1.在运行到红色脚本处出错,一般运行错误.但在第二个for语句设置断点后,单步调试时不会出错.
2.绿色代码第一行,用settoproterty改变属性值后,执行代码后点击"软件质量管理",是跳到改变属性后的页面还是仍然是"软件质量管理"页面.在单步执行时,查看页面每次循环都是"软件质量管理"页面.但在测试结果中查看,每次点击出现相应的界面(即改变属性值后相应的页面).
大家知道什么原因吗?

还有一个问题:
能不能把第二行绿色代码Link("[软件质量管理]")中的Link[软件质量管理]用变量代替?例如Link("&arry[j]")这种形式?正确的改怎么写,格式好象不正确,运行有错.
Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://bbs.51testing.com"
Set tags=Browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").object.links
Dim i,j ,arry()
i=0
For each element in tags
If Ucase(element.tagname)="A" and left(element.innertext,1)="[" Then
  ReDim preserve arry(i+1)
  arry(i)=element.innertext
i=i+1
End If
Next
For j=0 to i-1
Browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").Link("[软件质量管理]").SetTOProperty "text" ,arr(j)
browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").Link("[软件质量管理]").click

reporter.ReportEvent micPass,"click links",arry(j)
browser("Browser").Back
Next
作者: walker1020    时间: 2006-10-12 20:21
把 倒数第4行改为下面的代码试试看:
Browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").Link("[软件质量管理]").SetTOProperty("text" ,arr(j) )
.click
作者: Joan2005    时间: 2006-10-13 09:01
to 14.按你说的去做,就会出现,找不不到对象[软件测试综合栏目].
上边代码reporter.ReportEvent micPass,"click links",arry(j)下边加一句wait(time)运行就不会出错了.IE速度太慢,还没跳转到下一个页面就开始执行下面代码了,所以会出错.
现在唯一的疑问就是为什么单步执行和运行看到的连接页面是不同的?但最终结果是正确的?
作者: zhyb_2008    时间: 2006-10-18 17:21
感谢。
作者: viviv_wang    时间: 2006-10-20 18:35
感觉还是有些问题,发现都只参数化了link的对象,问题是link对象点击后的page都不需要去检查吗?
至少要检查page(object).exist吧.
那么page都需要参数化才可以吧.所以觉得必须两个地方同时参数化.
个人看法,joan2005的运行能通过,应该是运气吧.呵呵
作者: viviv_wang    时间: 2006-10-23 11:24
不知道下面这样是否可以?没有亲自验证.

Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://bbs.51testing.com/index.php"
Set tags=Browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").object.links
Dim i,j ,arry()
i=0
For each element in tags
If Ucase(element.tagname)="A" and left(element.innertext,1)="[" Then
  ReDim preserve arry(i+1)
  arry(i)=element.innertext
i=i+1
End If
Next
For j=0 to i-1
Browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").Link("[软件质量管理]").SetTOProperty "text" ,arr(j)
browser("Browser").Page("51Testing软件测试论坛 测试 | 软件测试").Link("[软件质量管理]").click
while(browser("Text:=xxx","index:="&j).exist)
browser("Text:=xxx","index:= "&j).back
reporter.ReportEvent micPass,"click links",arry(j)
'browser("Browser").Back
Next
作者: wuzhuayu    时间: 2006-10-24 23:27
弱弱的问一句,为啥我按照大家的办法,到了Navigate这一步,回放的时候就没有什么反应了呢??sdlkfj9
作者: joshfang    时间: 2006-12-14 03:26
我更弱弱的问一句,我怎么第一句都执行不了呢?

[ 本帖最后由 joshfang 于 2006-12-14 03:28 编辑 ]
作者: AlexanderIII    时间: 2007-1-2 13:57
楼上,你如果直接COPY代码到你的QTP里,当然运行不了.
因为你的QTP里的对象库没有对象呀,怎么执行?
你最好是自己先录制一次,然后再根据上面讲的步骤算法来重新写一下.
作者: lily_mu75    时间: 2007-1-12 18:09
标题: 回复 #1 lovetest6 的帖子
请问版主element.tagname和element.InnerText是属于哪一块的语言?在哪可以查到tagname和innertext属性的相关资料?我在QTP帮助文档里没有查到。
作者: wangxinwen    时间: 2007-1-17 14:12
我也想问楼上同样的问题,这样写以后看变量的变化,好像和预期的值不一样!
作者: terrylight    时间: 2007-1-26 10:08
For Each element in tags
    If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
                        ReDim Preserve arr(i+1)
                    arr(i)=element.InnerText
    i=i+1
        end if
Next
谁能告诉我这段代码的作用是什么? 特别是if那个语句
作者: Dorpnight    时间: 2007-2-6 15:43
标题: 回复 #2 lovetest6 的帖子
请教版主

然后得到所有版面的名称,也就是link的名称。
存到数组里面

如何存进数组啊?

我在研究你这个帖子,不知道怎么实现
作者: Hunter    时间: 2007-2-12 12:41
楼主的这个参数化的方法很不错 :),如果为了检验页面所有的Link,我有个简单方法
我分析一下搂主的意思:
某个页面的所有的Link都点击并Check一遍。
那么思路基本应该是:进入该页面(*)--〉点击Link--〉Page复位(*)--〉点击Link。。。。直到所有link被点击一次。
即:
Browser("Browser").Page("Page").Link("name:=我的初始页面").Click
Browser("Browser").Page("Page").Sync
For i=0 to 1000
        If Browser("Browser").Page("Page").Link("index:="&i).Exist Then
                msgbox Browser("Browser").Page("Page").Link("index:="&i).GetRoProperty("name")//获得Link名称
                Browser("Browser").Page("Page").Link("index:="&i).Click
                Browser("Browser").Page("Page").Sync
               {... ...} //此处可以根据Link名称进行Link页面的校验
                Browser("Browser").Page("Page").Link("name:=我的初始页面").Click  //此句为页面复位作用
                Browser("Browser").Page("Page").Sync
        Else
                Exit For
        End If
Next

msgbox "该页面中Link的数量为:"&i
//
作者: alex_82712    时间: 2007-5-7 11:57
标题: 回复 #26 Hunter 的帖子
Hunter兄
我按照你给的代码,运行了,有点问题
因为我的系统在每一个页面都会有一个Log out的Link,所以每次检查到这个Link的时候,就点了它退出了,之后了,退出到登陆界面,又有一个Forget password的Link,所以它就不停的去点这个Link。
我想做的是,如果遇到Log out只是检查不要点击它,必然就没发去检查Log out后面的Link了,这个语句该怎么写啊,就是说如果遇到Log out,不要点击这个Link,继续往下执行

请教Hunter 兄以及各路高手帮忙解决一下!
作者: alex_82712    时间: 2007-5-7 17:46
标题: 回复 #10 shengyan 的帖子
10F的,我用了可以,但是唯一的一点就是:要把所要测试的Link写到一个数组里,并且要改变For循环的次数。就这一点不太好。但是要参数化的Link不需要加到对象库也能运行。能写出这么强的代码,已经很不错了。

再次感谢

[ 本帖最后由 alex_82712 于 2007-5-7 17:52 编辑 ]
作者: jlk012    时间: 2007-5-21 00:52
太谢谢了!!!!!
作者: rivermen    时间: 2007-5-25 17:25
关于循环语句的使用:
在这里还是提倡使用For each
如果用Hunter 的方法,for i=1 to 1000(如果页面上的link 大于1000怎么办?)
不管1000个link的可能性如何,至少觉得不严密。
如果真的要计算page上的links数,还不如直接使用 standard checkpoint (QTP Tutorial 上)
作者: kheng-ling    时间: 2007-5-29 17:33
找了好久,终于找到我要查的问题的帖子了,太谢谢大家了

还有两个问题,有谁可以详细的教一下:

1.如何录制或写可以循环的脚步(比如我要测试很多次点击一个按钮“Cancel”,这个动作怎么录)
2.我想根据条件来跑程序,应该怎么写脚本呢?
比如在一定的条件下,会出现一种情况
另外的情况下,又会出现另外的情况

知道的同仁一定帮忙呀sdlkfj2
作者: gzj_06    时间: 2007-7-10 16:15
标题: 回复 #2 lovetest6 的帖子
For Each element in tags
    If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
                        ReDim Preserve arr(i+1)
                    arr(i)=element.InnerText
    i=i+1
        end if
Next
上面代码中if后的第2个条件不具有普遍性,并不是每个链接的InnerText都是以[开头的,比如注册,登录,退出等,所以觉得应该去掉这个条件
作者: Fantastic_test    时间: 2007-12-6 09:36
标题: 回复 20# 的帖子
我遇到的问题跟你的一样。但我不明白你下楼说的意思。是不是这样理解:先转到“http://bbs.51testing.com/default.php”此页面 ,然后点击各个栏目。而后在将刚才专家视图中的代码换成楼主的代码。但是“Browser("Browser").Navigate "http://bbs.51testing.com/index.php"
”这个地方的网址必须改为“http://bbs.51testing.com/default.php” 。。高手们帮我指点一下迷雾吧。我已经快崩溃了啊 。。。
作者: lovetest6    时间: 2007-12-12 20:05
原帖由 Fantastic_test 于 2007-12-6 09:36 发表
我遇到的问题跟你的一样。但我不明白你下楼说的意思。是不是这样理解:先转到“http://bbs.51testing.com/default.php”此页面 ,然后点击各个栏目。而后在将刚才专家视图中的代码换成楼主的代码。但是“Browser("Br ...


别崩溃啊。我想可能是论坛升级后,程序无法运行了。
作者: lovetest6    时间: 2007-12-12 20:15
原帖由 terrylight 于 2007-1-26 10:08 发表
For Each element in tags
    If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
                        ReDim Preserve arr(i+1)
                    arr(i)=element.InnerText
    i ...


这段代码的意思就是说,如果tagname是link的标记:<A>,而且link还是以"["开头。那么就认为这是板块名称的link。
就把它存到数组里面。
作者: lovetest6    时间: 2007-12-12 20:17
原帖由 lily_mu75 于 2007-1-12 18:09 发表
请问版主element.tagname和element.InnerText是属于哪一块的语言?在哪可以查到tagname和innertext属性的相关资料?我在QTP帮助文档里没有查到。


查一下MS的手册吧。vbscript的。我想应该能查到吧。
作者: jiaerxue    时间: 2007-12-13 20:23
标题: 回复 1# 的帖子
支持,顶
作者: kamina_    时间: 2007-12-29 10:23
.........顶一个....

[ 本帖最后由 kamina_ 于 2007-12-29 14:39 编辑 ]
作者: banweina    时间: 2007-12-29 18:08
标题: 看了
看了就要支持下
作者: wu52wen    时间: 2008-1-22 11:28
顶下,算是高水平的交流
作者: dragonflow    时间: 2008-1-23 14:03
刚才用到自己的测试脚本中试了下,还成。。谢谢。
借楼主的贵地问各同仁一个问题:
用QTP模拟局域网内二百个用户同时运行同一个控件,脚本如何写才好?
作者: walker1020    时间: 2008-2-28 23:03
另外,关于参数化Link,可以参考 http://bbs.51testing.com/viewthread.php?tid=104648
作者: bairiyishajin    时间: 2008-10-23 10:26
标题: 最近发现了一个LINK参数化的好方法
例:Browser("欢迎您登录Xxxx").Page("Xxxx 1.0").Frame("frmLeft").Link("链接的内容").SetTOProperty "text",DataTable("参数化表名", dtGlobalSheet)   

这样就可以实现了,关键点是.SetTOProperty "text",DataTable("参数化表名", dtGlobalSheet) ,这样也不用手写循环了,直接在参数化列表中创建多个数据就行了

详细请参见:
http://www.testage.net/index.php ... space-itemid-159801




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