51Testing软件测试论坛

标题: 这么做怎么会死循环? [打印本页]

作者: elmar    时间: 2005-10-20 11:26
标题: 这么做怎么会死循环?
...
rc = GUI_load(gui);
while (rc == E_FILE_OPEN){
  GUI_close_all();    #也尝试过GUI_unload(gui);
  rc = GUI_load(gui);
}

if (rc != E_OK){
  pause("Can't open GUI file.");
  texit;
}

set_window(SomeWindow, 2);

问题的起源是这样的:回放脚本的时候,偶尔会在set_window这句语句暂停,说找不到窗口。事实是运行大部分时候是可以找到这个窗口的。于是我在脚本运行到此处暂停后打开GUI map editor,发现gui map没有被load进来,也就是说GUI_load语句没有成功,查看了一下返回值是E_FILE_OPEN,于是我写了这个while循环。居然是个死循环??执行到此处就跳转不出去了
作者: null2    时间: 2005-10-20 11:54
从代码上看
如果GUI_load(gui)==E_FILE_OPEN
while就是死循环。
作者: elmar    时间: 2005-10-20 12:01
是啊,问题在于循环体里已经把gui close或unload了,再load,怎么还会返回E_FILE_OPEN呢?
怎么才能让GUI_load不返回E_FILE_OPEN?
作者: 迎风    时间: 2005-10-20 12:08
为什么要用循环呢?用IF来进行检查吧,比如GUI_load有问题,跳出提示框中止这项测试或不跳出就中止然后调用其它的测试,需要的话还可以写下异常记录,以供测试人员检查再加以解决~
作者: elmar    时间: 2005-10-20 13:38
我碰到的麻烦是这样的,我先写了个函数:

public function SomeTest(in CurrentWindow)
{
  auto gui, rc;
  gui = ".//GUI_Map//"&CurrentWindow&".gui";
  rc = GUI_load(gui);
  if(rc != E_OK){
    pause("Can't open GUI file: "&gui&".");
    texit;
  }
  set_window(CurrentWindow);
  #每个window一个gui map,而且window的名称跟gui map的文件名设为一样

  #do something else

  GUI_unload(gui);
}

结果有时调用这个函数成功,偶尔呢不成功。在set_window的时候说没有找到CurrentWindow。不知道是什么原因。奇怪的是此时GUI_load返回的是E_FILE_OPEN,这应该是不可能的,因为我在函数末已经unload了,其他地方也没有load过
作者: null2    时间: 2005-10-20 13:38
while (rc == E_FILE_OPEN){
  GUI_close_all();    #也尝试过GUI_unload(gui);
  rc = GUI_load(gui);
}

--------------------
while中rc又被负值GUI_load(gui)
作者: elmar    时间: 2005-10-20 13:43
while中rc又被负值GUI_load(gui)
-----------------------------------------------
但是赋值前gui已经被unload了,所以再次load的话也不应该rc==E_FILE_OPEN
作者: aswoon911    时间: 2005-10-21 14:44
的确有点怪异,
试试这样,不知是否有用

public function SomeTest(in CurrentWindow)
{
  auto gui, rc;

  #*****增加****
    GUI_close("<temporary>") ;
    GUI_unload_all();
  #*************

  gui = ".//GUI_Map//"&CurrentWindow&".gui";
  rc = GUI_load(gui);
  if(rc != E_OK){
    pause("Can't open GUI file: "&gui&".");
    texit;
  }
  set_window(CurrentWindow);
  #每个window一个gui map,而且window的名称跟gui map的文件名设为一样

  #do something else

  GUI_unload(gui);
}

BTW.你的GUI路径写成反斜杠好别扭啊.呵呵
作者: elmar    时间: 2005-10-24 11:12
呵呵,还是不行。挺怪异的。

BWT: 反斜杠我应该是从帮助文件的example里抄来到吧
作者: aswoon911    时间: 2005-10-24 13:06
这个是GUI_load在WR下按F1的help:

In the following example, the script loads a GUI file called file1.gui using the GUI_load function and then unloads it using the unload function.

# This loads the GUI file

GUI_load ("E:\\file1.gui");

好像是正斜杠啊
作者: elmar    时间: 2005-10-24 16:29
改成\\问题也一样。无语
不弄了,呵呵
作者: pcl2004_27    时间: 2005-10-25 10:41
问题的根源是 “回放脚本的时候,偶尔会在set_window这句语句暂停,说找不到窗口”

是否换种思路,你加入一个同步点,等待窗口出现?
如果窗口出现然后进行后续的操作,有可能是脚本速度执行太快,不是没有加载成功!

你试验一下同步点的方法!

如果不行,我觉得你研究一下gui map保存的对象,对象用到了那些属性,是否是物理描述中有的属性导致的问题!
作者: elmar    时间: 2005-10-25 11:10
的确是好的建议。我试一试
我测试的软件不是标准的windows软件,窗口都没有title,所以物理描述里的label不起作用。这时用什么方法来区别不同的窗口比较好?
我目前用的是{class: window, nchildren: SomeNumber}
作者: pcl2004_27    时间: 2005-10-25 22:30
extern unsigned int FindWindowA (string, long);
hWnd = FindWindowA(“类名字",0);
DWIN = "{ handle: " & hWnd & " }";
setwindow(DWIN,时间);
后续的操作

通过上边的办法,让你需要的窗体获得焦点
类名字的到的方法,你可以利用vc中spy++或者其他可以得到窗口的class name的工具得到。
作者: elmar    时间: 2005-10-26 10:38
呵呵,高!
得加载user32.dll吧?
作者: pcl2004_27    时间: 2005-10-26 12:04
对的!




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