xiaodouble 发表于 2007-12-10 14:17:18

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

用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!

nanchi 发表于 2007-12-11 15:44:49

RFT API里关于这一块的解释确实有些错误。
不过单独用processId应该是能找到的。楼主可以试着单独执行第一个ftWin的语句试试。

xiaodouble 发表于 2007-12-11 17:39:10

回复 2# 的帖子

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

nanchi 发表于 2007-12-12 09:47:19

回复 3# 的帖子

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

lovetest6 发表于 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();

xiaodouble 发表于 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 .getText() == "Windows Live Messenger"){
                              TestObject[] ftWinObjects = root.find(atList(atProperty(".processId", ftWin.getPid())));
                              System.out.println(ftWinObjects.length);
                        }                        
                }
-----------------------------------
find 那句提示:类型 SubitemFactory 中的方法 atProperty(String, Object)对于参数 (String, int)不适用

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

thanks for any help!


[ 本帖最后由 xiaodouble 于 2007-12-13 11:17 编辑 ]

xiaodouble 发表于 2007-12-13 10:58:07

to nanchi and lovetest6:
方便的话加我的MSN:jixiaapi@hotmail.com

lovetest6 发表于 2007-12-13 17:53:07

说说你要干什么行么?

xiaodouble 发表于 2007-12-13 22:32:06

回复 8# 的帖子

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

[ 本帖最后由 xiaodouble 于 2007-12-14 00:33 编辑 ]

lovetest6 发表于 2007-12-14 14:33:47

原帖由 xiaodouble 于 2007-12-13 22:32 发表 http://bbs.51testing.com/images/common/back.gif
我在一台机器上同时启动两个以上一样的程序的时候,录制的脚本就会因为无法区别这两个窗口,而无法运行。所以我想通过获取到进程ID,然后再通过进程ID来或取到这两个程序的主窗体(testObject),上面的代码是尝试用f ...

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

人家不是说了要object么,用int肯定不行了。

lovetest6 发表于 2007-12-14 14:35:03

一般这样写应该可以达到你的要求:

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

xiaodouble 发表于 2007-12-15 20:44:53

原帖由 lovetest6 于 2007-12-14 14:35 发表 http://bbs.51testing.com/images/common/back.gif
一般这样写应该可以达到你的要求:

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

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

nanchi 发表于 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.getText();
                        if (ftWin.getText().equals("Windows 任务管理器")) {
                                Integer ll = new Integer(ftWin.getPid());
                                TestObject[] ftWinObjects = root.find(atList(atProperty(
                                                ".processId", ll)));
                                System.out.println(ftWinObjects.length);
                        }
                }
结果最后找到2156个.

xiaodouble 发表于 2007-12-17 10:46:24

回复 11# 的帖子

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

xiaodouble 发表于 2007-12-17 10:48:17

回复 13# 的帖子

thanks, It works.

nanchi 发表于 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 编辑 ]

xiaodouble 发表于 2007-12-18 12:45:15

回复 16# 的帖子

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

[ 本帖最后由 xiaodouble 于 2007-12-18 13:53 编辑 ]

me.yh 发表于 2007-12-26 17:24:46

good

不错,学习了

heweiking_2007 发表于 2008-11-26 23:14:10

study!!!
页: [1]
查看完整版本: 用find()方法通过进程Id,获取TestObject