暗冷夜空的风 发表于 2008-3-6 22:19:56

关于QTP描述性编程的困惑,高手的进!

我想我需要介绍一下所测试的软件:Java开发,使用Eclipse集成开发环境。经典的LAMP框架。不过是个C/S架构的软件,即不是基于WEB或者Windows。

问题描述:
使用QTP录制脚本需要安装JAVA-ADDIN插件,QTP版本8.2.按道理说,DP是可以抛弃对象库的,即不需要对象库也能运行软件。但是,我现在制作好脚本,运行它则根本跑不起来。于是我录制了一遍,加上了对象库。然后我在QTP中引用对象库的对象。如此脚本才能运行。
困惑1:为什么我只写脚本它根本跑不起来?(我在加上对象库以后,可以用它来动态识别对象。只需要录制到控件对象即可,其属性可以动态制定。)

我在用此法录制菜单选择操作的时候,对于只有一级菜单的选择没有问题,但是多级菜单的时候,会提示找不到对象。经过多次调试,发现使用DP,只能让脚本识别到一级菜单项,但是不能让其子菜单项显示出来。
困惑2:奇怪的是如果使用录制的方式来做,却可以运行。

最大的困惑:DP在抛弃对象库之前还需要做什么设置?直接写这段代码根本跑不起来!

脚本内容很简单,就这么写:
firstmenus=“Basic Data”
‘之所以设置一个变量是因为我不打算使用DATATABLE与Action参数传递,直接使用Fuction存在vbs脚本中,然后将其设为脚本的Resource。这样就当作是一个共享函数在调用。
set firstmenu=Description.Create()
firstmenu(“label”).value=firstmenus

secondmenus=“Company Profile”
set secondmeun=Description.Create()
secondmenu("label").value=secondmenus

JavaWindow("PHX").Javamenu(firstmenu).JavaMenu(secondmenu).Click()
’现在脚本运行到此处就会报告说:找不到Javamenu(“Basic Data”)对象,然而用GETROPOPERTY去读这个对象的属性,则显示的就是Company Profile。这个对象绝对存在并且唯一!

set firstmenu=nothing
set secondmenu=nothing


注意:这里的两个变量是具体菜单项的名字,用这一句话就可以实现选择任何一个子菜单项了。不过,现在我必须写成这样才有效:
JavaWindow("PHX").Javamenu(“Basic Data”).JavaMenu(secondmenu).Click()
即,只能将最后一个菜单项DP,之前的不可以改。
然而这么做我就必须录下全部的二级菜单项,大概15个左右!!DP不是可以摆脱对象库吗?这到底怎么回事?请教高手!

原脚本如下,这是我目前的写法,只有这样写才能跑,不过这意着我无法完全控制子菜单项的选择。

'快捷按钮方式定义
shortcuts="Settle AR"
Set shortcut=Description.Create()
shortcut("label").value=shortcuts
JavaWindow("PHX").JavaButton(shortcut).Click

'一层菜单
firstmenus="VMS"
Set firstmenu=Description.Create()
firstmenu("label").value=firstmenus

secondmenus="Add PO"
Set secondmenu=Description.Create()
secondmenu("label").value=secondmenus

JavaWindow("PHX").JavaMenu(firstmenu).JavaMenu(secondmenu).Select
'二层菜单
thirdmenus="Customer"
Set thirdmenu=Description.Create()
thirdmenu("label").value=thirdmenus
JavaWindow("PHX").JavaMenu("Basic Data").JavaMenu("Company Profile").JavaMenu(thirdmenu).Select

thirdchildmenus="Account No. Maintenance"
Set thirdchildmenu=Description.Create()
thirdchildmenu("label").value=thirdchildmenus
JavaWindow("PHX").JavaMenu("Accounting").JavaMenu("Setup Financial Data").JavaMenu(thirdchildmenu).Select
'三层菜单

JavaWindow("PHX").JavaMenu("Export").JavaMenu("Ocean Job Management").JavaMenu("Consolidation").JavaMenu("Pack Container").Select

JavaWindow("PHX").JavaMenu("Accounting").JavaMenu("Setup Financial Data").JavaMenu("Account No. Maintenance").Select

'菜单项选择框架

[ 本帖最后由 暗冷夜空的风 于 2008-3-7 09:04 编辑 ]

hsjzfling 发表于 2008-3-6 22:32:36

请lz先注意下有没弄错""和"“”~~~文中出现了多个中文的双引号。。。

暗冷夜空的风 发表于 2008-3-7 08:47:56

中文引号??

谢谢楼上的提醒,不过和这个没关系,这段代码是我自己写的,不是从原脚本拷贝的,所以有手误是可能的。但是,在QTP中运行,这种错误早就被发现了,请考虑别的方面好吗?

hsjzfling 发表于 2008-3-7 10:41:56

<<JavaWindow("PHX").Javamenu(firstmenu).JavaMenu(secondmenu).Click()
<<’现在脚本运行到此处就会报告说:找不到Javamenu(“Basic Data”)对象
报错的原文是什么?Object not Found?

对象存在且唯一?未必吧~你是如何用GetROProperty获得的对象。。。
Java插件我没用过,如果Java的控件也支持ChildObjects方法的话,你可以尝试下如下代码
Set firstmenu=Description.Create
firstmenu("label").value="Basic Data"
Set Objs=JavaWindow("PHX").ChildObjects(firstmenr)
For i=0 To Objs.Count-1
        msgbox Objs(i).ToString
Next
看看输出的是否为唯一的你想要的对象

暗冷夜空的风 发表于 2008-3-7 11:36:47

我已经试验过了,就是你现在写的方法查的,结果是:1

hsjzfling 发表于 2008-3-7 12:37:16

<<JavaWindow("PHX").Javamenu(firstmenu).JavaMenu(secondmenu).Click()
<<’现在脚本运行到此处就会报告说:找不到Javamenu(“Basic Data”)对象
报错的原文是什么?

暗冷夜空的风 发表于 2008-3-7 13:11:58

今天早上又跑了次,发现跑到报错的那一步,软件界面的显示是:打开了Basic Data菜单项,但是没有做到鼠标移到第一个子菜单项的样子,同时还发现这个时候这个子菜单项的右侧居然没有出现黑色小箭头!(一般子菜单都是有个黑色箭头标志的,以便告诉用户还有子菜单项可以选择)。接着,过了一会,就报错。原文现在还拿不到(软件在更新中,这个是由其他部门负责的,我们只能等),不过意思就是说这个对象的父对象找不到或者在对象库中不存在这样的对象。

hsjzfling 发表于 2008-3-7 13:31:26

软件开发的初、中期阶段界面不太稳定,有这样的报错很正常的~~
更新好了你重新执行下,然后在报错步骤的下一步多执行个print err.description,将报错信息打出来看看好了(报错后点一下skip让系统能执行该语句)

暗冷夜空的风 发表于 2008-3-7 17:41:11

Cannot find the "JavaMenu" object's parent "JavaMenu" (class JavaMenu). Verify that parent properties match an object currently displayed in your application.

就是这段话了,代码是这样的:
JavaWindow("title:=PHX").JavaMenu("label:=Basic Data").JavaMenu("label:=Company Profile").JavaMenu("label:=Non-trade Vendor").Select

问题还是原样,用JAVA做的软件对菜单项的调用接口是什么样的?我想如果能利用软件本身的接口可能会好一点?

pirate 发表于 2008-3-7 17:43:15

偶也遇到过这种情况,至今没解决

hsjzfling 发表于 2008-3-7 18:18:49

晕死。。。嵌套这么多同类的对象。。。
Set oDesc=Description.Create
oDesc("label").value="Company Profile"
Set Objs=JavaWindow("title:=PHX").JavaMenu("label:=Basic Data").ChildObjects(oDesc)
For i=0 To Objs.Count-1
      msgbox Objs(i).ToString
Next
看看这个再报啥~~

暗冷夜空的风 发表于 2008-3-8 01:06:05

你的意思是说不可以引用同类对象?现在我都回家了,除非我先弄个JAVA程序来用才能调试这段代码了。这个问题很急,下周就得用上。假设这样做的结果还是1(毕竟录制得下来),接下来我该考虑哪方面出了问题?

hsjzfling 发表于 2008-3-8 13:55:39

不是不能,而是最好先参考下对象库中对象的层次结构~
报错提示的是JavaMenu找不到,所以你得检查下报错的语句中是否每个JavaMenu父对象都是唯一的确定的

暗冷夜空的风 发表于 2008-3-8 20:20:04

参考了很多资料后,我觉得出现这个报错的情况有两种:
1.界面上有同名同类的对象导致QTP无法确定到底对哪个对象操作
2.这个对象还没在界面上出现,必须通过另一个对象激活这个对象后,才能使此对象出现。而脚本语句中要指定这个名叫Commapny Profile的JavaMenu去做点击动作,界面上却还没出现这个隐藏对象,结果自然是找不到并会认为我指定了一个不存在的JavaMenu(界面上的确不存在。。。)

对于第一种情况,试验多次,无语了,肯定是唯一一个对象。而对于第二种情况,从界面表现(之前我已经描述过)看,第二种情况是比较合理的解释了。

因此,现在将问题转成:如何让这样的隐藏对象出现?就是让其在界面上显示出来。

暗冷夜空的风 发表于 2008-3-10 13:08:14

郁闷,没人这问题了?难道二级菜单我就只能手工录制了?

今天有雾 发表于 2008-3-10 14:34:45

不要一次性写到二级菜单,写操作一级菜单,然后再操作二级菜单,我想着会不会有这个问题

暗冷夜空的风 发表于 2008-3-10 16:38:51

不明白,我操作一级菜单就是把二级菜单截掉,加个Click。分开来操作?你能写出具体代码么?或者告诉我如何分开操作?

暗冷夜空的风 发表于 2008-3-11 09:31:03

郁闷ing。。。这个问题那么难以回答吗??

hsjzfling 发表于 2008-3-11 10:08:02

JavaWindow("title:=PHX").JavaMenu("label:=Basic Data").JavaMenu("label:=Company Profile").JavaMenu("label:=Non-trade Vendor").Select
如果我没猜错,这句代码你根本就没参考对象库中的对象层次结构,而是自己根据spy杜撰出来的。。。
我在13楼已经提醒过你去对比下对象库中的层次结构了~~
若猜错了,就当我没说了,能力有限~呵呵~~

暗冷夜空的风 发表于 2008-3-11 13:02:26

求教高手!

我查看过层次结构了,是这样的:
类型都是JavaMenu ,右边的属性列表都只有一个Label属性,值就是这个层次结构的名字而且没有其他属性标志他们。
Export
    Ocean Job Manager
          job Management
可见层次结构是没有问题的,报错的原因不显然不是这里。我找一段代码,似乎使用来分步操作的,不过是对于WEB的。。。我不知道JAVA的行不。
高手来看看吧,代码是这样的

Function RefreshObject (ByRef myObj , ByRef objParent, ByRef objDesc)   
Set objPlural = objParent.ChildObjects(objDesc)   
Set myObj = objPlural(0)
End Function

Set myObj = Browser("B").Page("P").WebEdit("txtbx")
Set objParent = myObj.GetTOProperty("parent")
Set objDesc = myObj.GetTOProperties
Browser("B").Page("P").Link("link").ClickBrowser("B").SyncBrowser("B").Back
Browser("B").SyncObjectRefresh myObj , objparent, objdesc
页: [1] 2
查看完整版本: 关于QTP描述性编程的困惑,高手的进!