elmar 发表于 2005-10-20 11:26:24

这么做怎么会死循环?

...
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:41

从代码上看
如果GUI_load(gui)==E_FILE_OPEN
while就是死循环。

elmar 发表于 2005-10-20 12:01:11

是啊,问题在于循环体里已经把gui close或unload了,再load,怎么还会返回E_FILE_OPEN呢?
怎么才能让GUI_load不返回E_FILE_OPEN?

迎风 发表于 2005-10-20 12:08:07

为什么要用循环呢?用IF来进行检查吧,比如GUI_load有问题,跳出提示框中止这项测试或不跳出就中止然后调用其它的测试,需要的话还可以写下异常记录,以供测试人员检查再加以解决~

elmar 发表于 2005-10-20 13:38:29

我碰到的麻烦是这样的,我先写了个函数:

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:46

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:40

while中rc又被负值GUI_load(gui)
-----------------------------------------------
但是赋值前gui已经被unload了,所以再次load的话也不应该rc==E_FILE_OPEN

aswoon911 发表于 2005-10-21 14:44:34

的确有点怪异,
试试这样,不知是否有用

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:09

呵呵,还是不行。挺怪异的。

BWT: 反斜杠我应该是从帮助文件的example里抄来到吧

aswoon911 发表于 2005-10-24 13:06:58

这个是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:26

改成\\问题也一样。无语
不弄了,呵呵

pcl2004_27 发表于 2005-10-25 10:41:51

问题的根源是 “回放脚本的时候,偶尔会在set_window这句语句暂停,说找不到窗口”

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

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

如果不行,我觉得你研究一下gui map保存的对象,对象用到了那些属性,是否是物理描述中有的属性导致的问题!

elmar 发表于 2005-10-25 11:10:18

的确是好的建议。我试一试
我测试的软件不是标准的windows软件,窗口都没有title,所以物理描述里的label不起作用。这时用什么方法来区别不同的窗口比较好?
我目前用的是{class: window, nchildren: SomeNumber}

pcl2004_27 发表于 2005-10-25 22:30:48

extern unsigned int FindWindowA (string, long);
hWnd = FindWindowA(“类名字",0);
DWIN = "{ handle: " & hWnd & " }";
setwindow(DWIN,时间);
后续的操作

通过上边的办法,让你需要的窗体获得焦点
类名字的到的方法,你可以利用vc中spy++或者其他可以得到窗口的class name的工具得到。

elmar 发表于 2005-10-26 10:38:59

呵呵,高!
得加载user32.dll吧?

pcl2004_27 发表于 2005-10-26 12:04:24

对的!
页: [1]
查看完整版本: 这么做怎么会死循环?