如何模拟从脚本中单击questdlg中的按钮

时间:2015-01-22 10:44:27

标签: matlab user-interface dialog automation

我目前正在编写测试程序来检查Matlab(R2014a)程序的图形前端计算与脚本版本相同的结果(两者都依赖于相同的基础方法)。

到目前为止,我通常使用以下模式来查找窗口和按钮的句柄并执行相应的回调:

handleWindow = findall(0, 'Tag', figureName);
handleButton = findobj(handleWindow, 'Tag', buttonName);
callbackButton = get(handleButton, 'Callback');
callbackButton(handleWindow, []);

这适用于使用GUIDE创建的所有自写图形。但是,在尝试自动搜索问题对话框(questdlg)时,我遇到了麻烦。

通过使用计时器异步执行命令直到对话框关闭,可以很容易地避免uiwait阻止进一步执行我的测试脚本的事实。这已经适用于CloseRequestFcn

我的问题是,questdlg中的按钮不存在真正的回调函数,而是调用uiresume(gcbf)。直接调用uiresume(handleQdlg)不会关闭对话框。

您是否有任何想法如何模拟点击这些按钮,或者您是否知道有更优雅的方法来模拟点击整体按钮?

1 个答案:

答案 0 :(得分:0)

事实证明我已经走上正轨。我的计时器延迟太短了。似乎我试图在尚未等待时恢复窗口。延迟时间更长。

这是我最终使用的功能:

function answerQuestDlg(obj, titleStr, index)
    %answerQuestDlg(obj, titleStr, index)
    %   Find the question dialog with specified title and simulate
    %   clicking the button with the appropriate index.
    %   If index is not 1, 2 or 3, simuluate pressing the X.

    allRootWindows = allchild(0);
    hQuestDlg = findobj(allRootWindows, 'Tag', titleStr);

    switch (index)
        case 1
            hButton = findobj(hQuestDlg, 'Tag', 'Btn1');
        case 2
            hButton = findobj(hQuestDlg, 'Tag', 'Btn2');
        case 3
            hButton = findobj(hQuestDlg, 'Tag', 'Btn3');
        otherwise
            callbackClose = get(hQuestDlg, 'CloseRequestFcn');
            callbackClose();
            return
    end

    set(hQuestDlg, 'CurrentObject', hButton);
    callbackButton = get(hButton, 'Callback');
    if ischar(callbackButton)
        callbackStr = strrep(callbackButton, 'gcbf', 'hQuestDlg');
        eval(callbackStr);
    else
        callbackButton();
    end
end