这么做怎么会死循环?
...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循环。居然是个死循环??执行到此处就跳转不出去了 从代码上看
如果GUI_load(gui)==E_FILE_OPEN
while就是死循环。 是啊,问题在于循环体里已经把gui close或unload了,再load,怎么还会返回E_FILE_OPEN呢?
怎么才能让GUI_load不返回E_FILE_OPEN? 为什么要用循环呢?用IF来进行检查吧,比如GUI_load有问题,跳出提示框中止这项测试或不跳出就中止然后调用其它的测试,需要的话还可以写下异常记录,以供测试人员检查再加以解决~ 我碰到的麻烦是这样的,我先写了个函数:
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过 while (rc == E_FILE_OPEN){
GUI_close_all(); #也尝试过GUI_unload(gui);
rc = GUI_load(gui);
}
--------------------
while中rc又被负值GUI_load(gui) while中rc又被负值GUI_load(gui)
-----------------------------------------------
但是赋值前gui已经被unload了,所以再次load的话也不应该rc==E_FILE_OPEN 的确有点怪异,
试试这样,不知是否有用
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路径写成反斜杠好别扭啊.呵呵 呵呵,还是不行。挺怪异的。
BWT: 反斜杠我应该是从帮助文件的example里抄来到吧 这个是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");
好像是正斜杠啊 改成\\问题也一样。无语
不弄了,呵呵 问题的根源是 “回放脚本的时候,偶尔会在set_window这句语句暂停,说找不到窗口”
是否换种思路,你加入一个同步点,等待窗口出现?
如果窗口出现然后进行后续的操作,有可能是脚本速度执行太快,不是没有加载成功!
你试验一下同步点的方法!
如果不行,我觉得你研究一下gui map保存的对象,对象用到了那些属性,是否是物理描述中有的属性导致的问题! 的确是好的建议。我试一试
我测试的软件不是标准的windows软件,窗口都没有title,所以物理描述里的label不起作用。这时用什么方法来区别不同的窗口比较好?
我目前用的是{class: window, nchildren: SomeNumber} extern unsigned int FindWindowA (string, long);
hWnd = FindWindowA(“类名字",0);
DWIN = "{ handle: " & hWnd & " }";
setwindow(DWIN,时间);
后续的操作
通过上边的办法,让你需要的窗体获得焦点
类名字的到的方法,你可以利用vc中spy++或者其他可以得到窗口的class name的工具得到。 呵呵,高!
得加载user32.dll吧? 对的!
页:
[1]