51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 5923|回复: 18
打印 上一主题 下一主题

用find()方法通过进程Id,获取TestObject

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-12-10 14:17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用find()方法通过进程Id,获取TestObject ,但是取不到,请高手指点一下,代码如下:
--------------------------------------------
          Dim ntpdProcess() As Process
        Dim pid As Integer
        Dim hnd As Long
        'Dim fetionWin1 As TopLevelSubitemTestObject
        ntpdProcess= Process.GetProcessesByName("notepad")
        pid = ntpdProcess(1).Id()
        hnd = ntpdProcess(0).Handle

        MsgBox(fetion.Length())  '---return 2 ,如果已启动两个Notepad进程
        '----------------------
        Dim root As RootTestObject
        Dim ftWin() As TestObject        
        root = RootTestObject.GetRootTestObject()
        'ftWin = root.Find(AtList(AtProperty(".processId", pid)))
         ftWin = root.Find(AtList(AtProperty(".processId", pid), AtDescendant(".domain", "Win")))
        'ftWin = root.Find(AtChild("Handle", hnd, ".domain", "Win"))

        MsgBox(ftWin.Length())  '----return 0(这里为什么会找不到?请帮忙看看)
------------------------------------------------------------
Thanks in advance!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-12-11 15:44:49 | 只看该作者
RFT API里关于这一块的解释确实有些错误。
不过单独用processId应该是能找到的。楼主可以试着单独执行第一个ftWin的语句试试。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2007-12-11 17:39:10 | 只看该作者

回复 2# 的帖子

终于有人回帖了,谢谢nanchi,以上几句都试过了,结果ftWin.Length()都是0。是不是find()用错了,编译也没有报错。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-12-12 09:47:19 | 只看该作者

回复 3# 的帖子

应该可以的,我试过了,我用的是java的代码。
建议单步调试看看,前面的ntpdProcess,pid ,hnd每次的返回值是否都正确。
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-12-12 20:30:53 | 只看该作者
楼主是 dot net啊?不懂这个。呵呵。

Solving ambiguous recognition of objects

Sometimes, Rational Functional Tester can't distinguish between two objects that are alike during playback. It's common for this to occur when two browsers or instances of the same application are open simultaneously. When two Web browsers are open, Rational Functional Tester tries to resolve the ambiguity by using an anchor to help determine the target object. Now that you know how to use the find method, you can identify the browser and application instances by using a TestObject reference.

Running more than one instance of an application simultaneously during playback will result in ambiguity about the target of commands, such as object() or click(). To resolve this, you can use ProcessTestObject when you call the startApp command. In the Listing 2 example, the ProcessTestObject functions as an anchor to locate the desired application.


Listing 2: Using the ProcessTestObject to anchor the application
               
ProcessTestObject pto1 = startApp("ApplicationOne");
ProcessTestObject pto2 = startApp("ApplicationTwo");
object(pto1, DEFAULT).click();
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2007-12-13 10:41:36 | 只看该作者
我用java试了一下,代码如下
--------------------------------------              
                RootTestObject root = RootTestObject.getRootTestObject();
                IWindow[] ftWin = root.getTopWindows();
                for(int j= 0; j<ftWin.length;j++){
                        if(ftWin[j] .getText() == "Windows Live Messenger"){
                              TestObject[] ftWinObjects = root.find(atList(atProperty(".processId", ftWin[j].getPid())));
                                System.out.println(ftWinObjects.length);
                        }                        
                }
-----------------------------------
find 那句提示:类型 SubitemFactory 中的方法 atProperty(String, Object)对于参数 (String, int)不适用

请帮忙看看 这个该怎么用?

thanks for any help!


[ 本帖最后由 xiaodouble 于 2007-12-13 11:17 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2007-12-13 10:58:07 | 只看该作者
to nanchi and lovetest6:
方便的话加我的MSN:jixiaapi@hotmail.com
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2007-12-13 17:53:07 | 只看该作者
说说你要干什么行么?
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2007-12-13 22:32:06 | 只看该作者

回复 8# 的帖子

我在一台机器上同时启动两个以上一样的程序的时候,录制的脚本就会因为无法区别这两个窗口,而无法运行。所以我想通过获取到进程ID,然后再通过进程ID来或取到这两个程序的主窗体(testObject),上面的代码是尝试用find方法通过processId 得到testObject.

[ 本帖最后由 xiaodouble 于 2007-12-14 00:33 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-12-14 14:33:47 | 只看该作者
原帖由 xiaodouble 于 2007-12-13 22:32 发表
我在一台机器上同时启动两个以上一样的程序的时候,录制的脚本就会因为无法区别这两个窗口,而无法运行。所以我想通过获取到进程ID,然后再通过进程ID来或取到这两个程序的主窗体(testObject),上面的代码是尝试用f ...


如果是这样的话,你启动的时候就应该记住进程ID。后面的find试着用别的描述找一下吧。

人家不是说了要object么,用int肯定不行了。
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2007-12-14 14:35:03 | 只看该作者
一般这样写应该可以达到你的要求:

ProcessTestObject pto1 = startApp("ApplicationOne");
ProcessTestObject pto2 = startApp("ApplicationTwo");
object(pto1, DEFAULT).click();
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2007-12-15 20:44:53 | 只看该作者
原帖由 lovetest6 于 2007-12-14 14:35 发表
一般这样写应该可以达到你的要求:

ProcessTestObject pto1 = startApp("ApplicationOne");
ProcessTestObject pto2 = startApp("ApplicationTwo");
object(pto1, DEFAULT).click();


谢谢了,我明白怎么用了,对于两个已经启动的程序,可以通过ProcessTestObject(TestObjectReference ref)构造函数,分别创建 pto1 和 pto2
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2007-12-16 23:43:54 | 只看该作者

回复 6# 的帖子

你的java代码有几个地方稍微改改就可以,下面是我写的找windows任务管理器的一个:
                RootTestObject root = RootTestObject.getRootTestObject();
                IWindow[] ftWin = root.getTopWindows();
                for (int j = 0; j < ftWin.length; j++) {
                        String text = ftWin[j].getText();
                        if (ftWin[j].getText().equals("Windows 任务管理器")) {
                                Integer ll = new Integer(ftWin[j].getPid());
                                TestObject[] ftWinObjects = root.find(atList(atProperty(
                                                ".processId", ll)));
                                System.out.println(ftWinObjects.length);
                        }
                }
结果最后找到2156个.
回复 支持 反对

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2007-12-17 10:46:24 | 只看该作者

回复 11# 的帖子

我在VB.net 下用 object(pto1, DEFAULT).click();时DEFAULT下有一条波浪线,提示应为表达式,编译不过。但在java下就没有这种问题,不知道这个在VB下怎么用?谢谢答复。
回复 支持 反对

使用道具 举报

该用户从未签到

15#
 楼主| 发表于 2007-12-17 10:48:17 | 只看该作者

回复 13# 的帖子

thanks, It works.
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2007-12-17 11:17:28 | 只看该作者

回复 9# 的帖子

1、获取进程ID来获取两个窗口的方式行不通。
2、可以通过lovetest6介绍的方式,这也是RFT中非常通用的一种方法。
3、我再在lovetest6的基础上再提供一点供参考,第一步在获取ProcessTestObject时,还有另外一个办法:通过root.find(atChild(".class", "","accessibleContext.accessibleName",""))),同时获取存在的多个窗口,接下来第二步跟lovetest6的方法一样。

两种方法的比较:
  前者的优点:在程序起动时区分开了两个不同的窗口及窗口中的子对象
  后者的优点:区分对象不需要重新启动程序,只要存在即可区分。当在测试应用程序时,即可以区分同时打开的多个主程序窗口,对于同一主程序中打开的多个相同dialog(它们和主程序在同一进程中)也可以区分开,所以适用的范围更广一些。缺点是,程序中的多个窗口引用不知道分别指向的是界面上的那个窗口,需要通过进一步的计算才能区分。

[ 本帖最后由 nanchi 于 2007-12-17 11:26 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

17#
 楼主| 发表于 2007-12-18 12:45:15 | 只看该作者

回复 16# 的帖子

问题解决了,非常感谢你们给我提供的信息和思路。

[ 本帖最后由 xiaodouble 于 2007-12-18 13:53 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2007-12-26 17:24:46 | 只看该作者

good

不错,学习了
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2008-11-26 23:14:10 | 只看该作者
study!!!
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-23 14:31 , Processed in 0.079725 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表