QtWebKit-Userscript/Javascript注入

QtWebKit-Userscript/Javascript注入,javascript,python,qtwebkit,userscripts,spynner,Javascript,Python,Qtwebkit,Userscripts,Spynner,我一直在使用QtWebkit/Spynner在Python中进行测试工作。由于QtWebKit与Chrome的Webkit一样支持Javascript,是否可以像Chrome中的常规用户脚本一样,在页面开始处注入用户脚本或Javascript片段 希望这是一个简单的问题!提前谢谢 您可以使用以下方法: 为注册一个处理程序 在该事件处理程序中,为注册一个新的事件处理程序 在第二个事件处理程序中,使用(或Spynner的runjs方法)运行Javascript 这是执行其实用程序脚本所采用的方法。不

我一直在使用QtWebkit/Spynner在Python中进行测试工作。由于QtWebKit与Chrome的Webkit一样支持Javascript,是否可以像Chrome中的常规用户脚本一样,在页面开始处注入用户脚本或Javascript片段


希望这是一个简单的问题!提前谢谢

您可以使用以下方法:

  • 为注册一个处理程序
  • 在该事件处理程序中,为注册一个新的事件处理程序
  • 在第二个事件处理程序中,使用(或Spynner的
    runjs
    方法)运行Javascript
  • 这是执行其实用程序脚本所采用的方法。不幸的是,我不能给出Python代码示例,因为我不熟悉Qt Python绑定。

    来自前面的答案(Niklas B.): capybara webkit使用一个不太有用的信号槽双重订阅(frameCreated javaScriptWindowObjectCleared),并在injectJavascriptHelpers()函数中使用sender()调用,这对于解耦代码来说不是一个好的做法

    实际上,您只需要将“javaScriptWindowObjectCleared”信号从mainFrame()连接到插槽

    假设您正在为PyQt使用旧的小部件编码样式(没有qml):

    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)