使用 UI 自动化获取具有可访问名称的 QLabel 的值

Getting the value of a QLabel with an accessible name using UI Automation

我正在尝试为使用 QLabel 向用户显示输出的应用程序编写 UI 测试(使用 Windows UI 自动化)。

我这样创建标签:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;
    w.setWindowTitle("MyWindowTitle");
    auto centralWidget = new QWidget(&w);
    centralWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    QVBoxLayout layout(centralWidget);

    auto interrestingLabel = new QLabel(centralWidget);
    QString valueCalculatedByApp = "1337";
    interrestingLabel->setText(valueCalculatedByApp);
    //interrestingLabel->setAccessibleName("MyAccessibleName");
    layout.addWidget(interrestingLabel);

    auto uninterrestingLabel = new QLabel(centralWidget);
    uninterrestingLabel->setText("uninterrestingText");
    layout.addWidget(uninterrestingLabel);

    w.setCentralWidget(centralWidget);
    w.show();

    return a.exec();
}

Inspect.exe 现在显示值“1337”作为小部件的名称:

没有可访问的名称

问题在于我的 UI 测试需要找出正确的标签。

如果我取消注释 setAccessibleName 行,小部件现在可以识别,但文本在属性中不再可见。

具有可访问的名称

有没有一种方法可以读取具有可访问名称的 QLabel 的文本,或者是否有另一种方法可以在仍然能够读取文本的同时使 QLabel 可识别?

我找到了解决方法:

我使用 QLineEdit 而不是 QLabel。我将 enabled 设置为 false,因此它不可选择或不可编辑(像 QLabel)并使用 QSS 使其看起来像 QLabel:

#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QMainWindow>
#include <QSizePolicy>
#include <QVBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setAttribute(Qt::AA_NativeWindows);
    QMainWindow w;
    w.setWindowTitle("MyWindowTitle");
    auto centralWidget = new QWidget(&w);
    centralWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    QVBoxLayout layout(centralWidget);

    auto interrestingLabel = new QLineEdit(centralWidget);
    QString valueCalculatedByApp = "1337";
    interrestingLabel->setText(valueCalculatedByApp);
    interrestingLabel->setAccessibleName("MyAccessibleName");
    interrestingLabel->setEnabled(false);
    interrestingLabel->setStyleSheet(
        "border-style: none;"
        "color: black;"
        "background:transparent"
    );
    layout.addWidget(interrestingLabel);

    auto uninterrestingLabel = new QLabel(centralWidget);
    uninterrestingLabel->setText("uninterrestingText");
    layout.addWidget(uninterrestingLabel);

    w.setCentralWidget(centralWidget);
    w.show();

    return a.exec();
}