【问题标题】:How can I simulate clicking a button in a questdlg from a script如何从脚本模拟单击 questdlg 中的按钮
【发布时间】:2015-01-22 10:44:27
【问题描述】:

我目前正在编写测试例程,以检查 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) 不会关闭对话框。

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

【问题讨论】:

  • 只是一个想法:在代码的开头设置一个“脚本标志”会不会太麻烦,如果从脚本运行程序,你会设置为true;那么在这种情况下,您可以使用swtich/case 语句模拟quesdlg 的答案,然后对话框将“关闭”?
  • @Benoit_11 如果我尝试不为此使用全局变量会很麻烦(而且我真的不想在最终版本中使用这些变量)。我想最简单的方法是用另一个函数重载questdlg,该函数决定是调用内置 questdlg 还是使用易于访问的方法来更改其输出的虚拟函数。但在所有情况下,最好只使用自制对话。我仍然不必调整测试的“有效负载”。
  • 是的,我同意,我想为问题对话框构建一个简单的 GUI 将为您省去很多麻烦!
  • 我还建议为此目的构建您自己的小 gui,这就是我在我的 gui 工具箱中所做的。例如,您需要小心查找对象的方法,并管理您的测试是否发现超过 1 个 handleWindow。
  • @matlabgui 我同意,我需要小心处理这些事情。但是由于我不打算在成品中使用那些(仅在应该在干净环境中启动的测试脚本中)具有例如具有此标题的多个窗口表示这些脚本中较早出现的问题,无论如何都应该修复。

标签: matlab user-interface dialog automation


【解决方案1】:

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

这是我最终使用的函数:

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

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多