From the previous answer (Niklas B.):
the capybara-webkit uses a not so useful double subscription of signal-slot (frameCreated-javaScriptWindowObjectCleared), and uses a sender() call in the injectJavascriptHelpers() function that is not a good practice for a decoupled code.
Actually you only need to connect the "javaScriptWindowObjectCleared" signal from the mainFrame() to your slot.
Supposing you are using the old Widget coding style for PyQt (no qml then):
class InstrumentedPage(PyQt5.QtWebKitWidgets.QWebPage):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.loadFinished.connect(self.finished)
self.mainFrame().javaScriptWindowObjectCleared.connect(self.initYourJavascriptAtTheBeginningHere)
def javaScriptConsoleMessage(self, message, lineNumber, sourceID):
message = "%s (%s:%d)" % (message, sourceID, lineNumber)
self.__logger.info("JS :: %s" % message )
def initYourJavascriptAtTheBeginningHere(self):
js = "console.log(\"INITED\");"
self.mainFrame().evaluateJavaScript(js)
def injectYourJavascriptHere(self, js):
return self.mainFrame().evaluateJavaScript(js)
def finished(self, status):
self.__logger.info("InstrumentedPage.finished() :: init status => %s" % status)
class MainWindow(PyQt5.QtWidgets.QWidget):
def __init__(self, config, config_file_name, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow.Ui_MainWindow()
self.ui.setupUi( self )
self.web_page = InstrumentedPage()
self.ui.webView.setPage(self.web_page)