如何在不模拟对话框的情况下处理 pytest-qt 中的模态对话框

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

我正在使用 pytest-qt 来自动测试 PyQt GUI。对话框需要作为测试的一部分进行处理(不应模拟对话框)。

例如,必须处理单击按钮后出现的文件对话框。有2个问题

  1. 按钮单击命令后,程序控制转到事件处理程序而不是下一行,我可以尝试将 mouseclick/keystrokes 发送到对话框。

  2. 由于 QDialog 未添加到主窗口小部件,因此它未在主窗口小部件的子窗口中列出。那么如何获取QDialog的引用呢?

我试过多线程,但是没有用,后来我发现QObjects不是线程安全的。

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

可以使用 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)

请参阅此 link 了解更多详情