mardi 10 avril 2018

how to take a screenshot Within a QT QTest setting

I'm trying to take a screen shot during some tests where the application is being ran on an iOS simulator.

The app looks something like this:

main.cpp

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

#ifdef TEST
    thingTests = new ThingTests(&engine);
    tabletTests->startTestSuite(argv[1]);

#endif

  ...

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

ThingTests.cpp

TabletTests::TabletTests(QQmlApplicationEngine *engine) : QObject(nullptr), m_testSuiteName(NULL)
{
    m_engine = engine;
}

void TabletTests::startTestSuite(char *testSuiteName)
{
    m_testSuiteName = testSuiteName;
    connect(m_engine, SIGNAL(objectCreated(QObject*,QUrl)), this, SLOT(onObjectCreated(QObject*,QUrl)));
}


void TabletTests::onObjectCreated(QObject *, const QUrl &) {
 // run settings test for now, later on control with command line arguments
    SettingsTest *settingsTest = new SettingsTest(m_engine);
    QTest::qExec(settingsTest);
}

SettingsTest.cpp

void SettingsTest::openWarningModeSelectionTest()
{
    m_settingsTester->performTestOperation(SettingsTester::SettingsTestOperation::WarningModeSelection);
    QTest::qWait(1000);
    bool optionSelectorDisplayed = DialogController::getInstance()->optionSelectorShown();
    // This clip came from here: https://stackoverflow.com/questions/21697185/how-to-take-screenshot-of-qml-application-without-qquickview
    foreach(QObject* obj, this->m_engine->rootObjects()) {
      QQuickWindow* window = qobject_cast<QQuickWindow*>(obj);
      if (window) {
        QImage image = window->grabWindow();
        qDebug() << image;
      }
    }
    QVERIFY(optionSelectorDisplayed);
}

I've inherited this codebase and I'm not very familiar with QT, but I tried to only include relevant things in the above snippets.

What I want to be able to do is take some screenshots on what a page looks like at certain times in the tests.

When I have TEST defined, my tests for the app go and do their thing, but they blowup when the window->grabWindow() line is hit with an ASSERT error in assert w in scenegraph/qsgthreadedrenderloop.cpp in the qt libraries.

Aucun commentaire:

Enregistrer un commentaire