2016-07-26 101 views
1

我正在使用QTest在我的應用程序中創建一些自動化的GUI測試如何通過QTest訪問QMessageBox

我可以從我的應用程序中使用的命令訪問控件:

savePushButton = mainWindow->findChild<QPushButton *>("savePushButton"); 

它工作正常,但現在我必須點擊一個QMessageBox提示的OK按鈕。

我創建了QMessageBox提示在我的應用程序是這樣的:

if(something_wrong) 
{ 
    QMessageBox::warning(new Widget(), "Title", "Something wrong!"); 
} 

我怎樣才能訪問這個QMessageBox提示,和它的按鈕?

回答

1

我在以下鏈接中找到解決方案:http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib

它使用命令QApplication::topLevelWidgets();來獲取窗口小部件列表。然後它搜索消息框小部件並模擬關閉消息框的密鑰輸入(QTest::keyClick(mb, Qt::Key_Enter);)。

實施例:

void MyTest::testDialog() 
{ 
    QTimer::singleShot(500, this, SLOT(timeOut())); 
    QVERIFY(functionThatProducesMessageBox()); 
} 

void MyTest::timeOut() 
{ 
    QWidgetList allToplevelWidgets = QApplication::topLevelWidgets(); 
    foreach (QWidget *w, allToplevelWidgets) { 
     if (w->inherits("QMessageBox")) { 
      QMessageBox *mb = qobject_cast<QMessageBox *>(w); 
      QTest::keyClick(mb, Qt::Key_Enter); 
     } 
    } 
} 

頭文件必須包含Q_OBJECT宏使用信號和槽機構。 實施例:

class MyClass: public QWidget 
{ 
    Q_OBJECT 
public: 
    ... 

它的工作良好,對我由於UI(線程)顯示消息框時被阻斷。

注意:請記住在添加Q_OBJECT宏時重建項目。

2

它常常有助於看Qt's auto tests

void ExecCloseHelper::timerEvent(QTimerEvent *te) 
{ 
    if (te->timerId() != m_timerId) 
     return; 

    QWidget *modalWidget = QApplication::activeModalWidget(); 

    if (!m_testCandidate && modalWidget) 
     m_testCandidate = modalWidget; 

    if (m_testCandidate && m_testCandidate == modalWidget) { 
     if (m_key == CloseWindow) { 
      m_testCandidate->close(); 
     } else { 
      QKeyEvent *ke = new QKeyEvent(QEvent::KeyPress, m_key, Qt::NoModifier); 
      QCoreApplication::postEvent(m_testCandidate, ke); 
     } 
     m_testCandidate = Q_NULLPTR; 
     killTimer(m_timerId); 
     m_timerId = m_key = 0; 
    } 
} 

從代碼來看,你可以通過QApplication::activeModalWidget()得到的消息框。原生測試(我假設它們是本地的)小部件很困難,這可能是他們選擇發送關鍵事件的原因,因爲您不需要知道這些按鈕的位置,就像你用鼠標點擊一樣。

+0

感謝@Mitch爲您付出的努力。我在以下鏈接上找到了解決方案:[http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib](http://www.qtcentre.org/threads/31239-Testing -modal-dialogs-with-QTestLib)。它使用'QApplication :: topLevelWidgets();'並且運行良好。再次感謝。 – KelvinS