How to handle modal dialog in pytest-qt without mocking the dialog
Asked Answered
B

1

4

I am using pytest-qt to automate the testing of a PyQt GUI. The dialogs need to be handled as a part of the testing(dialogs should not be mocked).

For example, file dialog that comes after a button-click has to be handled. There are 2 problems

  1. After the button click command, the program control goes to the event handler and not to the next line where I can try to send mouseclick/keystrokes to the dialog.

  2. Since the QDialog is not added to the main widget, it is not being listed among the children of the main widget. So how to get the reference of the QDialog?

I tried multi-threading but that didn't work, later I found that QObjects are not thread-safe.

def test_filedialog(qtbot, window):
    qtbot.mouseClick(window.browseButton, QtCore.Qt.LeftButton, delay=1)
    print("After mouse click")
    #This is where I need to get the reference of QDialog and handle it
Banian answered 25/3, 2019 at 11:16 Comment(2)
try with: print(QtGui.QApplication.topLevelWidgets())Craal
Thanks, @Craal I can try that for getting the dialog reference. But I need to solve the first issue to try this.Banian
B
-1

It can be done using QTimer.

def test_filedialog(qtbot, window):
    def handle_dialog():
        # get a reference to the dialog and handle it here
    QTimer.singleShot(500, handle_dialog)
    qtbot.mouseClick(window.browseButton, QtCore.Qt.LeftButton, delay=1)

Refer this link for more details

Banian answered 29/3, 2019 at 16:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.