2012-04-10 12 views
3

Ich habe Tests in Python mit QtWebkit/Spynner arbeiten. Wie QtWebKit Javascript-Unterstützung wie Chrome Webkit hat, ist es möglich, ein Userscript oder ein Stück JavaScript unter den Anfang einer Seite wie ein normales Benutzerscript in Chrome injizieren?QtWebKit - Userscript/Javascript Injection

Hoffentlich eine einfache Frage für diese Erfahrung! Danke im Voraus!

Antwort

2

können Sie den folgenden Ansatz verwenden:

  1. einen Handler Registrieren Sie sich für QWebPage.frameCreated
  2. Innerhalb dieser Ereignishandler, einen neuen Event-Handler für QWebFrame.javaScriptWindowObjectCleared
  3. In diesen zweiten Event-Handler registrieren, verwendet QWebFrame.evaluateJavaScript (oder Spynners runjs Methode), um Ihr Javascript laufen zu lassen.

Dies ist der Ansatz von capybara-webkit, um seine Dienstprogramme auszuführen. Leider kann ich Ihnen keinen Python-Code geben, da ich mit den Qt Python-Bindings nicht vertraut bin.

0

Von der vorherige Antwort (Niklas B.): das Capybara-Webkit verwendet eine nicht so nützlich Doppel Zeichnung von Signal-Slot (frameCreated-javaScriptWindowObjectCleared) und verwendet einen Sender() -Aufruf in dem injectJavascriptHelpers() Funktion, ist keine gute Praxis für einen entkoppelten Code.

Eigentlich müssen Sie nur das "javaScriptWindowObjectCleared" -Signal vom mainFrame() an Ihren Steckplatz anschließen.

Angenommen, Sie sind mit dem alten Widget Codierungsstil für PyQt (keine qml dann):

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)