51Testing软件测试论坛

标题: 当运行的环境不同时,对话框的FRAME是变化的怎么办? [打印本页]

作者: FLY000    时间: 2010-11-19 18:31
标题: 当运行的环境不同时,对话框的FRAME是变化的怎么办?
本帖最后由 FLY000 于 2010-11-19 19:15 编辑

在系统中,同一个功能,在不同的任务、不同的报表期、不同的数据集下使用,

这个功能的对话框的FRAME的属性是变化的怎么办?
作者: FLY000    时间: 2010-11-19 18:36
本帖最后由 FLY000 于 2010-11-19 19:10 编辑

[attach]66446[/attach]

Function DetailAudit()
   Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").Link("审核").Click
   Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").Link("详细审核").Click
   Browser("Wtap2.0").Page("DataManagePage").Frame("DetailAuditFrame").Link("下一步").Click
   Browser("Wtap2.0").Page("DataManagePage").Frame("DetailAuditFrame").Link("下一步_2").Click
   Browser("Wtap2.0").Page("DataManagePage").Frame("DetailAuditFrame").Link("开始").Click
   Browser("Wtap2.0").Page("DataManagePage").Frame("DetailAuditFrame").Link("关闭").Click
End Function

这个函数,当运行不同的任务时,FRAME的属性会改变,导致对象找不到,脚本运行失败.
作者: FLY000    时间: 2010-11-19 19:07
本帖最后由 FLY000 于 2010-11-19 19:14 编辑

一般FRAME对象是通过name来识别的,或者html id,但是我们程序的程序这两个值都是空的,INDEX值又比较大,而且不稳定;
所以只能通过url来识别,且当在不同的环境下(如:任务,报表期)使用此功能(如:汇总,审核功能)时,那么这个对话框的url中的参数就不一样;

审核功能的FRAME
[attach]66444[/attach]


导入数据功能的FRAME
[attach]66445[/attach]
作者: lyscser    时间: 2010-11-19 23:33
正则表达式……模糊匹配就是了
作者: dreamever    时间: 2010-11-20 09:58
我习惯的做法是,首先取出当前页面中所有的IFRAME对象,然后遍历对象列表,判断队列中对象的URL字符串是否包含指定的字符串,如果包含,则返回
作者: FLY000    时间: 2010-11-22 11:16
本帖最后由 FLY000 于 2010-11-22 11:17 编辑

Function CollectData()
   Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").Link("汇总").Click
   Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").Link("汇总数据").Click
   Set objFrame = GetFrame("hz")
   objFrame.WebCheckBox("层层汇总").Click
   objFrame.Link("汇总").Click
End Function

Function GetFrame(RegName)
   Set oDescFrame = Description.Create()
   oDescFrame("micclass").Value = "Frame"
   Set oDescFrameCollection = Browser("Wtap2.0").Page("DataManagePage").ChildObjects(oDescFrame)
   For i = 0 to oDescFrameCollection.count-1
    strUrl = oDescFrameCollection(i).GetRoproperty("url")
    If InStr(1,strUrl,RegName)>0  Then
   Set GetFrame =oDescFrameCollection(i)
   Exit For
    End If
   Next
End Function

通过Set objFrame = GetFrame("hz")可以得到想要的那个FRAME,
但是
objFrame.WebCheckBox("层层汇总").Click
这句提示:
[attach]66458[/attach]
作者: FLY000    时间: 2010-11-22 11:50
objFrame.WebCheckBox("html tag:=INPUT","type:=checkbox","name:=recur").Click

改为描述性编程也不行

对象不支持此属性或方法: 'objFrame.WebCheckBox'
作者: FLY000    时间: 2010-11-22 14:55
Browser("Wtap2.0").Page("DataManagePage").Frame("url:=.*hz*").WebCheckBox("html tag:=INPUT","type:=checkbox","name:=recur").Click

正则匹配 “hz”这个字符串匹配不到

Frame("url:=.*hz*")
作者: yabest    时间: 2010-11-22 15:39


Browser("Wtap2.0").Page("DataManagePage").Frame("url:=.*hz*").WebCheckBox("html tag:=INPUT","type:=c ...
FLY000 发表于 2010-11-22 14:55

作者: FLY000    时间: 2010-11-22 16:33

作者: yabest    时间: 2010-11-22 16:50
FLY000 发表于 2010-11-22 16:33



通过ChildObjects得到的子对象已经是真实存在的实际对象了,只能再用ChildObjects来得到孙对象
作者: FLY000    时间: 2010-11-22 16:53
通过ChildObjects得到的子对象已经是真实存在的实际对象了,只能再用ChildObjects来得到孙对象
yabest 发表于 2010-11-22 16:50


哦,明白了
作者: FLY000    时间: 2010-11-22 16:55
那么我用正则匹配的方法来做,要怎么写正则表达式来匹配“hz”这个字符?:

Browser("Wtap2.0").Page("DataManagePage").Frame("url:=.*hz*").WebCheckBox("html tag:=INPUT","type:=checkbox","name:=recur").Click

正则匹配 “hz”这个字符串匹配不到

Frame("url:=.*hz*")
作者: yabest    时间: 2010-11-22 16:56
其实不用这么麻烦,绕半天的。

你就直接在对象库里,将那个frame对象的条件,用正则表达式 设置成url=".*hz.*",就可以了,跟你写这一堆代码的作用是等价的。
作者: yabest    时间: 2010-11-22 17:03
当这个frame的url会变化时,你可以动态修改这个frame仓库对象的属性,然后再进行操作,比如

Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").SetTOProperty("url", "bj")
Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").WebCheckBox("层层汇总").Click
作者: yabest    时间: 2010-11-22 17:07
那么我用正则匹配的方法来做,要怎么写正则表达式来匹配“hz”这个字符?:

Browser("Wtap2.0").Page("D ...
FLY000 发表于 2010-11-22 16:55



   

正则表达式不过关。

.     表示 1个 任意字符
.*   表示 任意个 任意字符
z*  表示 任意个 字符z  如  "" , z ,  zz ,  zzzzzzzzzzzz
作者: FLY000    时间: 2010-11-22 17:17
哦,太感谢了,都明白了
作者: FLY000    时间: 2010-11-22 17:25
Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").SetTOProperty("url", "bj")

这个做法可能行不通吧,要通过SetTOProperty把url设置成运行时的实际值,比如:
url实际的值是:../hz.jsp?taskId={09CB19B7-D75D-4E3A-B4B6-C9CE4269AE2E}.0603bc0db3e3193538931a185558aa04&bbq=201011--&userid=2210000

而这个实际值在不同的环境时,是会变化的
作者: yabest    时间: 2010-11-22 17:38
本帖最后由 yabest 于 2010-11-22 17:41 编辑
Browser("Wtap2.0").Page("DataManagePage").Frame("CollectMainFrame").SetTOProperty("url", "bj")

这 ...
FLY000 发表于 2010-11-22 17:25



    我只是偷懒,设置成 ".*hz.*" 就可以了,一样可以用正则表达式。

    尽量用对象库来实现,这样简单,代码简洁。

    不要用描述性写那么多代码,看得多累啊!
作者: FLY000    时间: 2010-11-22 17:50
哦,我是尽量用对象库来做的
作者: FLY000    时间: 2010-11-22 19:10
本帖最后由 FLY000 于 2010-11-22 19:14 编辑

Browser("Wtap2.0").Page("DataManagePage").Frame("CollectFrame").SetTOProperty "url",".*hz.*"
Browser("Wtap2.0").Page("DataManagePage").Frame("CollectFrame").WebCheckBox("层层汇总").Click
--------------
这样做不行,运行提示:Cannot identify the object "层层汇总" (of class WebCheckBox). Verify that this object's properties match an object currently displayed in your application.



Browser("Wtap2.0").Page("DataManagePage").Frame("CollectFrame").SetTOProperty "url",".*hz.*"
msgbox Browser("Wtap2.0").Page("DataManagePage").Frame("CollectFrame").GetToProperty("url")
//得到的值是 .*hz.* 说明SetTOProperty复制成功了
Browser("Wtap2.0").Page("DataManagePage").Frame("CollectFrame").highlight
//但是执行这句高亮显示的是外面的大的frame
[attach]66486[/attach]
Browser("Wtap2.0").Page("DataManagePage").Frame("url:=.*hz.*").highlight
//这样可以高亮显示我需要获得的frame
[attach]66487[/attach]
作者: lyscser    时间: 2010-11-22 21:00
其实不用这么麻烦,绕半天的。

你就直接在对象库里,将那个frame对象的条件,用正则表达式 设置成url=". ...
yabest 发表于 2010-11-22 16:56




作者: Coolwind9    时间: 2010-11-23 09:25

作者: Coolwind9    时间: 2010-11-23 09:25

作者: Coolwind9    时间: 2010-11-23 09:25
??
作者: Coolwind9    时间: 2010-11-23 09:25

作者: Coolwind9    时间: 2010-11-23 09:34
使用对象来完成!
作者: Coolwind9    时间: 2010-11-23 09:34
000
作者: Coolwind9    时间: 2010-11-23 09:43
  1. [code][code][code][code]
复制代码
[/code][/code][/code][/code]
作者: Coolwind9    时间: 2010-11-23 09:43
[code][code][code][code]
作者: FLY000    时间: 2010-11-24 16:17
当这个frame的url会变化时,你可以动态修改这个frame仓库对象的属性,然后再进行操作,比如

Browser("Wt ...
yabest 发表于 2010-11-22 17:03



    请yabest再帮忙看看我在21楼说的那个现象是为什么?我按照你的这个办法行不通
作者: yabest    时间: 2010-11-24 18:32
Browser("Wtap2.0").Page("DataManagePage").Frame("CollectFrame").SetTOProperty "url",".*hz.*"
Browse ...
FLY000 发表于 2010-11-22 19:10



  检查一下,看看对象库里Frame("CollectFrame")的正则表达式开关打开了没有?
  Frame("url:=。。。")这种描述性写法会默认打开正则表达式,
  而Frame("CollectFrame")这种对象库写法则会根据对象库里的设置来决定是否打开正则表达式开关。

  另外,可以在对象库里,编辑对象属性,并点HighLight按钮,实时看到HighLight结果,
  以此来检查属性设置是否正确,所对应的对象是否正确,无需用代码来调试和修改属性设置。
作者: FLY000    时间: 2010-11-24 20:57
回复 32# yabest

[attach]66561[/attach]

[attach]66562[/attach]

对象库里FRAME是这样的,是不是表示没有打开正则表达式?
作者: sunnyswu    时间: 2010-11-24 21:24
这么做你看如何
如果说,hz 能唯一识别该frame
set mydesc = description.create
mydesc("url").value = ".*hz.*"
Browser("Wtap2.0").Page("DataManagePage").Frame(mydesc).WebCheckBox("层层汇总").Click
不知道 能不能解决,可以试验一下吧
作者: yabest    时间: 2010-11-25 10:22
这么做你看如何
如果说,hz 能唯一识别该frame
set mydesc = description.create
mydesc("url").value = ...
sunnyswu 发表于 2010-11-24 21:24


老兄,  Frame(mydesc) 这个对象使用了描述性方法,从Frame(mydesc) 对象开始就宣告脱离对象库了,离开对象库的对象族谱了。
Frame(mydesc) 及它的子孙都变成私生子、黑户了,只能自己靠自己,只能自说自话,自己描述自己是谁了。
QTP哪知道你说的Frame(mydesc) .WebCheckBox("层层汇总")是谁家的孩子,排行第几,有什么特征啊!对象库里根本就没有Frame(mydesc),更不用说Frame(mydesc)的子孙了!
作者: yabest    时间: 2010-11-25 10:42
回复  yabest

对象库里FRAME是这样的,是不是表示没有打开正则表达式?
FLY000 发表于 2010-11-24 20:57



Object Identification设置是用来录制新对象的时候用的,对象被加入对象库时默认都会用这个设置。
但对于录制好的已存在于对象库里的对象不起作用,你需要直接对对象库里的对象进行修改。

Object Identification设置里没有正则表达式的开关,这个开关只有在对象库里编辑某个对象的某个属性时才有,是针对属性的,不是针对对象的。
比如某个对象有name和url两个属性,可以编辑name输入固定值,然后编辑url属性,启用正则表达式开关,并输入含通配符的url值。

那个Smart Identification最好不要用,如果你已经准确的设置好了属性,就能正确的识别到对象,再用Smart Identification模糊匹配只会来添乱。
作者: yabest    时间: 2010-11-25 10:52
Browser("Wtap2.0").Page("DataManagePage").Frame("url:=.*hz.*").highlight
//这样可以高亮显示我需要获得的frame
FLY000 发表于 2010-11-22 19:10


既然你这个描述性方法可以准确找到对象,那你可以在对象库里对这个对象进行同样的设置,

也就是去掉所有属性,去掉Enable Smart Identification开关,然后添加url属性,修改url属性值启用正则表达式,并输入.*hz.*

这样就可以保证你用对象库方式和描述性方式是完全同样的设置,完全等价。




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