【问题标题】:Selenium keeps opening new windowSelenium 不断打开新窗口
【发布时间】:2022-01-22 01:16:41
【问题描述】:

我用 PyQT5 制作了 GUI,一些按钮使用 Selenium 连接到代码。

按钮运行良好,但问题是当我单击按钮时 Selenium 不断打开新窗口。

如果我在类之外定义变量“driver = webdriver.Edge(~~)”,Selenium 在一个窗口中可以正常工作。但是,我想在单击按钮时打开浏览器,而不是在代码开头。

1. btn_1_clicked 和 btn_2_clicked 在一个窗口中工作,但问题是我运行代码后浏览器就会打开。

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import QCoreApplication, Qt
from selenium import webdriver
    
driver = webdriver.Edge('C:/Users/HOME/Desktop/MicrosoftwebDriver.exe')

form_class = uic.loadUiType('C:/Users/HOME/Desktop/test.ui')[0]

class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.btn_1.clicked.connect(self.btn_1_clicked)
        self.btn_2.clicked.connect(self.btn_2_clicked)

    def btn_1_clicked(self):
        driver.get("https://*.com/")

    def btn_2_clicked(self):
        driver.get("https://www.google.com")

if __name__ == "__main__":
    app = QCoreApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()

2。浏览器仅在我单击按钮时打开,但问题是 Selenium 不断打开新窗口。

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import QCoreApplication, Qt
from selenium import webdriver

form_class = uic.loadUiType('C:/Users/HOME/Desktop/test.ui')[0]

class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.btn_1.clicked.connect(self.btn_1_clicked)
        self.btn_2.clicked.connect(self.btn_2_clicked)

    def btn_1_clicked(self):
        driver = webdriver.Edge('C:/Users/HOME/Desktop/MicrosoftwebDriver.exe')
        driver.get("https://*.com/")

    def btn_2_clicked(self):
        driver = webdriver.Edge('C:/Users/HOME/Desktop/MicrosoftwebDriver.exe')
        driver.get("https://www.google.com")

if __name__ == "__main__":
    app = QCoreApplication.instance()
    if app is None:
        app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()

提前致谢。

【问题讨论】:

    标签: python selenium pyqt5


    【解决方案1】:

    您应该将驱动程序设为实例属性,并仅在需要时创建它。

    使用cached_property 驱动程序在第一次请求属性时加载,然后它将始终使用返回的驱动程序:

    from functools import cached_property
    
    class WindowClass(QWidget):
        # ...
        @cached_property
        def driver(self):
            return webdriver.Edge('C:/Users/HOME/Desktop/MicrosoftwebDriver.exe')
    
        def btn_1_clicked(self):
            self.driver.get("https://*.com/")
    
        def btn_2_clicked(self):
            self.driver.get("https://www.google.com")
    

    【讨论】: