QEventLoop in QWebEnginePage.javaScriptConfirm completely skipped

107 Views Asked by At

I have a subclass of QWebEnginePage where I would like to override the javaSrciptConfirm function to create my own popup. It would work by starting a QEventLoop, and connecting the QPushButton.clicked.connect signals from the OK and Cancel buttons on the popup to the QEventLoop.quit slot.

I could not get this to work, as it appeared that the QEventLoop was completely bypassed immediately. So I tried with just a yellow button that shows in the top left corner, and when it is clicked it should exit the QEventLoop, and then then turn red, which still does't work:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
import sys

class MainWindow(QMainWindow):
  def __init__(self,parent=None,*args,**kwargs):
    QMainWindow.__init__(self,parent,*args,**kwargs)

    self._webEngine = QWebEngineView(self)
    self._webEngine.setPage(MyWebEnginePage(self._webEngine))
    self._webEngine.setUrl(QUrl("https://www.seleniumeasy.com/test/javascript-alert-box-demo.html"))

    self.setCentralWidget(self._webEngine)

    self.showMaximized()

class MyWebEnginePage(QWebEnginePage):
  def __init__(self,parent,*args,**kwargs):
    QWebEnginePage.__init__(self,parent,*args,**kwargs)

  def javaScriptConfirm(self,url,msg):
    print("in here")
    button = QPushButton(self.parent().window())
    button.setStyleSheet("background-color: yellow")
    button.show()

    loop = QEventLoop(self.parent().window())
    button.clicked.connect(loop.quit)
    loop.exec_()

    button.setStyleSheet("background-color: red")

def myExceptHook(e,v,t):
  sys.__excepthook__(e,v,t)

if __name__ == "__main__":
  sys.excepthook = myExceptHook
  app = QApplication(sys.argv)
  window = MainWindow()
  app.quit()

When the program runs, it navigates to https://www.seleniumeasy.com/test/javascript-alert-box-demo.html, and I click on the button that brings up the JS confirm box (2nd button down). In the corner of the screen, a red button shows. It should be yellow, and only turn red once I click it, but the QEventLoop never loops, it is exited from immediately. When I can get the button to stay yellow until clicked, I can then remove it and connect the popup buttons to the QEventLoop.quit slot.

I have tried making the loop variable a self.loop, different parent objects for the QEventLoop, making the button a self.button, I'm not sure why the loop quits straight away. What do I need to change in order for the QEventLoop to actually loop?

0

There are 0 best solutions below