MFC 资源 ID 和 Squish

问题描述 投票:0回答:2

我正在尝试使用 Squish 自动化一些 GUI 测试,但在 Squish 中不断遇到 MFC 资源 ID 的问题。

我创建了一个这样的静态标签:

CStatic m_Status;
m_Status.Create("", WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_LEFT, 
                mCfg->rectStatus(), this, 42);
m_Status.SetWindowText("42 is the answer");

当我用 Squish 监视这个标签时,我得到的只是:

{"container": o_Pane, "text": "42 is the answer", "type": "Label"}

但是,没有身份证。随着文本的变化,仅基于文本的匹配元素并不是最佳的。

在同一程序中,其他标签是通过资源管理器向导创建的。对于这些标签,Squish 能够获取资源 ID 并设置正确的“nativeObject”属性。

是否有某种方法可以使在源代码中创建的 CStatic 对象也对 Squish 正确可见,如果可能的话,使用 nativeObject 属性?

c++ mfc squish
2个回答
1
投票

间谍可用于检查对象属性。一旦您知道 Squish 看到了哪些属性,您就可以使用 Squish 对象真实名称中的属性及其值来识别所需的对象。

但是,由于未编译 Squish 的 MFC 支持,因此它通常无法访问此类 ID,因为它通过 Window Messaging 获取有关 MFC 控件的所有信息。

这些 ID 可能是通过 UI 自动化公开的。如果是这种情况,请使用Inspect进行检查。如果是这样,请尝试通过 Squish 的 UI 自动化支持来识别对象。为此,将 SQUISH_DIR\lib xtensions\win\uiautomation.ext 中的优先级更改为高于 SQUISH_DIR\lib xtensions\win\mfc.ext 中的优先级,使用新的测试套件(以便进行良好的测量和测试),启动来自 Squish 的 AUT,选择该对象并查看是否看到不同的对象属性,以及 nativeObject 属性是否为非 null(为空/null 意味着 MFC 支持正在提供对该对象的访问)。


0
投票

如果您包含 Windows 控件 ID,Squish 会将其与实名中的“id”属性进行匹配。因此,将示例中的真实姓名替换为

{"container": o_Pane, "id": 42, "type": "Label"}

应该可以。

默认情况下,在 Squish GUI 中生成真实姓名时,Squish 不会自动包含 Windows 控件 ID。但是,可以编辑 XML 描述符文件(存储在安装了 Windows 版 Squish 的

etc
子目录中)来告诉 Squish 在为特定 Windows 控件类型生成真实名称时包含控件 ID。例如,将 windowswrapper_descriptors.xml 文件中的此条目从

更改为
<descriptor>
    <type name="Label"/>
    <realidentifiers>
        <property>text</property>
    </realidentifiers>
</descriptor>

<descriptor>
    <type name="Label"/>
    <realidentifiers>
        <property>text</property>
        <property>id</property>
    </realidentifiers>
</descriptor>

会将 Windows 控件 ID 添加到为标签控件生成的真实名称中。

这对于 MFC 应用程序特别有用,因为控件 ID 通常非常稳定,但对于其他类型的 Windows 应用程序可能不太有用(这可能就是默认情况下不使用控件 ID 的原因)。文档文件 https://doc.qt.io/squish/object-name- Generation.html 解释了 XML 描述符文件语法,并提供了有关如何执行此操作的更多详细信息。

注意:我已经在 Squish v7.2.1 中使用了这种技术,但我不知道这种支持很久以前就存在,因为我只使用过这个版本的 Squish。

© www.soinside.com 2019 - 2024. All rights reserved.