diff --git a/src/qmltest/quicktest.cpp b/src/qmltest/quicktest.cpp
index 66f1d861a2276c34505b8083b769b656605d7b66..ef026d45735afb5d04bb5d43a205a13729015de1 100644
--- a/src/qmltest/quicktest.cpp
+++ b/src/qmltest/quicktest.cpp
@@ -62,6 +62,8 @@
 #include <stdio.h>
 #include <QtGui/QGuiApplication>
 #include <QtCore/QTranslator>
+#include <QtTest/QSignalSpy>
+
 QT_BEGIN_NAMESPACE
 
 class QTestRootObject : public QObject
@@ -145,6 +147,24 @@ void handleCompileErrors(const QFileInfo &fi, QQuickView *view)
     results.stopLogging();
 }
 
+static bool qWaitForSignal(QObject *obj, const char* signal, int timeout = 5000)
+{
+    QSignalSpy spy(obj, signal);
+    QElapsedTimer timer;
+    timer.start();
+
+    while (!spy.size()) {
+        int remaining = timeout - int(timer.elapsed());
+        if (remaining <= 0)
+            break;
+        QCoreApplication::processEvents(QEventLoop::AllEvents, remaining);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QTest::qSleep(10);
+    }
+
+    return spy.size();
+}
+
 int quick_test_main(int argc, char **argv, const char *name, const char *sourceDir)
 {
     QGuiApplication* app = 0;
@@ -284,10 +304,11 @@ int quick_test_main(int argc, char **argv, const char *name, const char *sourceD
             // If the test already quit, then it was performed
             // synchronously during setSource().  Otherwise it is
             // an asynchronous test and we need to show the window
-            // and wait for the quit indication.
+            // and wait for the first frame to be rendered
+            // and then wait for quit indication.
             view->show();
-            QTest::qWaitForWindowShown(view);
-            rootobj.setWindowShown(true);
+            if (qWaitForSignal(view, SIGNAL(frameSwapped())))
+                rootobj.setWindowShown(true);
             if (!rootobj.hasQuit && rootobj.hasTestCase())
                 eventLoop.exec();
         }
diff --git a/tests/auto/qmltest/pixel/tst_pixel.qml b/tests/auto/qmltest/pixel/tst_pixel.qml
index 624f084817143c461e845399cebd2c150efe9dd2..d36bce21aba12a4ec355b7e614430b52511342af 100644
--- a/tests/auto/qmltest/pixel/tst_pixel.qml
+++ b/tests/auto/qmltest/pixel/tst_pixel.qml
@@ -52,7 +52,6 @@ Rectangle {
         when: windowShown
 
         function test_pixel() {
-           wait(200);
            var img = grabImage(rect);
            compare(img.pixel(20, 20), Qt.rgba(255, 0, 0, 255));
            compare(img.red(1,1), 255);