Home > Software design >  Selenium keeps opening new window
Selenium keeps opening new window

Time:12-21

I made GUI with PyQT5, and some pushbuttons are connected to codes using Selenium.

The buttons work well, but problem is that Selenium keeps opening new window when I click the button.

If I define variable "driver = webdriver.Edge(~~)" outside of class, Selenium works fine in one window. However, I want to open the browser when I click the buttons, not at the start of the code.

1. btn_1_clicked and btn_2_clicked work in one window, but the problem is that the browser opens as soon as I run the code.

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://stackoverflow.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. Browser opens only when I click the buttons, but the problem is that Selenium keeps opening new window.

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://stackoverflow.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_()

Thanks in advance.

CodePudding user response:

You should make the driver an instance attribute, and create it only when required.

Using cached_property the driver is loaded the first time the property is requested and then it will always use the returned driver:

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://stackoverflow.com/")

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