oicq997 发表于 2010-9-10 12:30:31

请教一个关于QTP描述性编程的问题--Dialog控件无法被识别

这两天一直被一个问题困扰,同时希望您能够耐心的看完下面的描述,多谢!
实际场景:场景很简单,就是一个登录操作,当用户名为空时点击【登录】按钮,系统弹出个Dialog对话框提示“用户名不能为空”,而后点
击对话框中的【确定】按钮。
测试脚本设计:在登录操作后加入一个判断,判断这个Dialog对话框是否存在,如果存在,利用Reporter向报告中输入一个信息:“测试用例
执行成功,登录失败”,而后点击【确认】按钮。
遇到的问题:在判断Dialog是否存在的时候,QTP没有报错,只是在报告中说“Dialog对象不能被发现”。而后,我又换了一个思路,不做判断
直接点击Dialog对话框中确定按钮,结果造成QTP报错,截图如下,大意是说Dialog对象找不到。
代码如下:
Call login
Function login()
        '关闭所有的IE窗口,避免出现问题
        SystemUtil.CloseProcessByName "iexplore.exe"
        '打开IE,进入站点
        SystemUtil.Run "iexplore.exe"
        Set browsDesc = description.create()
        Set pageDesc = description.create()
        Set curPage = Browser(browsDesc).Page(pageDesc)
        curPage.Sync
        Browser(browsDesc).Navigate "http://200.101.13.3:8080/DCSM"
        curPage.Sync
        Browser("title:=登录","name:=登录").Page("title:=登录").WebEdit("name:=username").Set ""
        Browser("title:=登录","name:=登录").Page("title:=登录").WebEdit("name:=passwordshow").set "admin"

        Browser("creationtime:=0").Page("title:=登录").WebButton("name:=登 录").Click
        '代码运行到这里的时候都是没有问题的。重点的是下面这句直接点击按钮这行代码。在此处QTP会报错,见截图。
        Browser("creationtime:=0").Dialog("text:=Windows Internet Explorer").WinButton("text:=确定").Click
        '下面是用来判断Dialog是否存在的,此处QTP不会直接报错,但在报告中提示“对象不能被发现”
        If Browser("title:=登录","name:=登录").Dialog("text:=Windows Internet Explorer","creationtime:=0","location:=1").Exist Then
                msgbox "success"
        End If
End Function
原因分析:我一直怀疑是没有找对定位这个Dialog的属性。所以尝试使用了能够定位这个对话框的其他属性。例如:
location:=X,creation:=X,index:=X。结果还是一样的找不这个Dialog对象。
这个问题都困扰我好几天了。请大侠们经过的时候进来看看,帮小弟看看还有没有其他办法。在下感激涕零。
另外,因为不想依赖对象库,所以没有采用录制的方法制作脚本。还有,脚本中Browser用了两种方法描述对象,也是没有问题,可以通过的。
再有一个情况是:到后来我没办法了,直接录制个脚本,结果OK,没有问题,正常录制的脚本就能够识别这个Dialog。看脚本生成的情况,录制的脚本也是用text这个元素定位的啊,为啥轮到用描述性编程就识别不到了???
以下是录制的脚本:
Browser("登录").Page("登录").WebEdit("passwordshow").SetSecure "4c89b025e3c892ccef58"
Browser("登录").Page("登录").WebButton("登 录").Click
Browser("登录").Dialog("Microsoft Internet Explorer").WinButton("确定").Click '回放到这里也是能通过的。
Browser("登录").Page("登录").Sync
Browser("登录").Close

[ 本帖最后由 oicq997 于 2010-9-10 12:45 编辑 ]

oicq997 发表于 2010-9-10 12:44:06

自己先坐个沙发吧。

自己先坐个沙发吧。

希望早点儿有人关注。。。

kavensyw 发表于 2010-9-10 12:53:31

虽然不知道你具体原因。
登录页面,建议Browser用title;Dialog用index识别就行了

skyzhu 发表于 2010-9-10 13:10:10

尝试在desktop下找Dialog,而不是在Browser下,对象库层次顺序感觉有问题
或者说是现在的系统Dialog层次变了

你可以尝试使用description 在Browser找任何下一级的子对象,结果可能就是只有 page

YangMay 发表于 2010-9-10 14:03:26

我觉得你的Dialog的text属性有可能有问题,
我昨天遇到一咱情况,Dialog的text不是"Windows Internet Explorer"而是"Mircorsoft Internet Explorer"..
你再确定一下你弹出的对话框.

oicq997 发表于 2010-9-10 14:14:05

多谢战友们的点化

多谢战友们的点化,我马上就去验证。

oicq997 发表于 2010-9-10 14:57:32

问题已经解决

原帖由 YangMay 于 2010-9-10 14:03 发表 http://bbs.51testing.com/images/common/back.gif
我觉得你的Dialog的text属性有可能有问题,
我昨天遇到一咱情况,Dialog的text不是"Windows Internet Explorer"而是"Mircorsoft Internet Explorer"..
你再确定一下你弹出的对话框.
多谢这位兄弟的建议,我是用你的方法修改了脚本,结果脚本通过。成功。
分析原因:是不同的浏览器版本造成了Dialog对话框的text是不同的。但是,又有一个新问题出现了。即便在IE7的环境下,使用"text:= Windows Internet Explorer"也是识别不成功的,只能用IE6才能正常识别。难道,不同的IE版本QTP会区别对待?非常希望有高手能够为我解惑。我有一个大胆的怀疑,这是不是QTP的一个BUG呢。呵呵,希望是,这样也好让我感到欣慰一些啊。
下面是IE6和IE7在Object spy下的不同识别结果。

kavensyw 发表于 2010-9-10 16:26:05

对于不同浏览器,你可以用正则表达式啊,
比如:最简单的
"text:= .*Internet Explorer"

另外如果你dialog对象就一个,索性用"index:=0"来识别不就行了吗,管它啥标题和其他属性的变化

iamfeiyu1009 发表于 2010-9-10 19:26:29

恩,描述性编程还是比较好用,比一般的代码更能识别页面元素,而且写起来也比较灵活
frameworkmanager的框架就不错

TIB 发表于 2010-9-10 21:59:57

IE6和IE7存在一些区别,在写QTP脚本时需要注意,参考:
http://knowledgeinbox.com/articles/qtp/general/difference-between-ie6-and-ie7/

TIB 发表于 2010-9-10 22:29:52

IE7要这样描述Dialog:
"text:=Windows Internet Explorer","nativeclass:=#32770"

blizzardlyk 发表于 2010-9-11 07:59:56

IE7下面,对跳出的Dialog的操作,不需要父对象Browser。建议吧Browser那一层去掉试试

skyzhu 发表于 2010-9-13 10:13:22

QTP10.0 很多情况下干脆就不承认Dialog是在 Browser下了,只有桌面下才找的到,呵呵。
另外中文系统下的IE8的text是中文的信息

Description的属性,在桌面 desktop下还不能用正则,只有Browser下才行 (QTP9.0已测试)

以前也被Dialog搞晕过一段时间

[ 本帖最后由 skyzhu 于 2010-9-13 10:16 编辑 ]

xhhuang1618 发表于 2010-9-13 10:47:33

browser("我的资料").Dialog("来自网页的消息").Exist ---通过录制回放的方式,脚本的结果为True;

    Browser("name:=我的资料").Dialog("text:=来自网页的消息").Exist----居然结果为False??这个结果让我费解了大半天,有人说是描述Dialog的参数太少,于是我把Dialog中能用到的参数都放进去,结果还是不行.....最后我在帮助文档里找到了Dialog的nativeclass属性,结果就成功了。

    小结:web对象是使用micclass来描述的,windows对象是使用nativeclass来描述的,理解了之后我们就可以把脚本写成下面这种方式:Browser("name:=我的资料").Dialog("nativeclass:=#32770").Exist---执行结果True,而#32770就是用于描述Dialog的属性

skyzhu 发表于 2010-9-13 11:46:03

回复 14# 的帖子

以前我也是 Dialog("nativeclass:=#32770") 这样做的
但一次偶然的使用了QTP10,全挂了,一个都没找到,暂时也没研究和那机器环境是不是有关系
后来就搜的复杂了,整桌面用Description找Dialog,然后再过滤,再抓TXT。。。再正则验证

Jun_Li 发表于 2010-9-19 08:59:38

认为相这样正则可以搞定的问题 就就不用描述性了, 正则用着简单, 虽然可能在查找时会浪费一点时间 ,可描述性编程的代码行比较高个人观点

chipucca 发表于 2010-9-19 19:11:41

恩,是的,注意对象所属位置很重要,没抢到回答,哎....

luxiuxiu1987 发表于 2011-2-10 16:25:32

”QTP10.0 很多情况下干脆就不承认Dialog是在 Browser下了,只有桌面下才找的到“
原来如此终于解决了~~~

回首见云飞 发表于 2011-5-12 15:36:28

如果我要Dialog上的文字呢,而且还是多行文字?

wolaizhinidexin 发表于 2011-5-12 16:34:43

如果你不想判断弹出框中的提示语之类的,或者只想点击这个确定按钮,我建议你用我写的MonitorQTP,监控这类弹出框,然后它会把它关了的!
页: [1] 2
查看完整版本: 请教一个关于QTP描述性编程的问题--Dialog控件无法被识别