关闭打开的 Selenium 浏览器也会关闭 PyQt 主窗口

问题描述 投票:0回答:1

提供的代码打开一个 PyQt5 窗口,用户可以在其中启动 selenium 浏览器。 问题是当我关闭浏览器时,主窗口也会关闭。

测试.py

from PyQt5 import QtWidgets
from selenium import webdriver
import sys, json


def isRunning(driver):
    try:
        driver.window_handles
        return True
    except Exception:
        return False


def handleButton2():
    print("test")


app = QtWidgets.QApplication(sys.argv)


def handleButton():
    profile = webdriver.FirefoxProfile('selenium')
    driver = webdriver.Firefox(profile)
    driver.get('https://duckduckgo.com/')
    logs = []
    curr = ''
    while isRunning(driver):
        if curr != driver.current_url:
            logs = []
            curr = driver.current_url
        log = driver.execute_script(
            "return window.performance.getEntries();")
        for x in log:
            if x not in logs:
                logs.append(x)
                s = str(x).replace("'", '"')
                s = s.replace(': "', ': ').replace('", ', ', ')
                s = s.replace(': ', ': "').replace(', ', '", ')
                s = s.replace('"}', '}').replace('}', '"}')
                s = s.replace(': "[', ': [').replace(': "{', ': {')
                s = s.replace(']"', ']').replace('}"', '}')
                print(s)
                url = json.loads(s)['name']
                if url.startswith('http'):
                    print(url)
        app.processEvents()  # VERY important


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.button = QtWidgets.QPushButton('Test')
        self.button.clicked.connect(handleButton)
        self.button2 = QtWidgets.QPushButton('Test2')
        self.button2.clicked.connect(handleButton2)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.button)
        layout.addWidget(self.button2)


def mainGUI():
    window = Window()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    mainGUI()

我知道 while 循环停止导致了这个问题,但我不知道如何解决它。 我尝试在循环停止后重新打开窗口,但没有成功。

python python-3.x selenium-webdriver pyqt pyqt5
1个回答
0
投票

避免

handleButton
中的while循环阻塞主事件循环。相反,使用 Qt 的
QTimer
定期检查浏览器窗口是否打开。自定义计时器间隔以满足您的应用程序的需求。

© www.soinside.com 2019 - 2024. All rights reserved.