QtWebKit - Userscript/Javascript Injection

QtWebKit - Userscript/Javascript Injection

本文关键字:Javascript Injection Userscript QtWebKit      更新时间:2023-09-26

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

希望是这些经历的简单问题!提前感谢!

您可以使用以下方法:

  1. 注册QWebPage.frameCreated处理程序
  2. 在该事件处理程序
  3. 中,注册一个新的事件处理程序以QWebFrame.javaScriptWindowObjectCleared
  4. 在第二个事件处理程序中,使用 QWebFrame.evaluateJavaScript(或 Spynner 的 runjs 方法)来运行 Javascript。

这是 capybara-webkit 执行其实用程序脚本的方法。不幸的是,我不能给你示例Python代码,因为我不熟悉Qt Python绑定。

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

实际上,您只需要将来自mainFrame()的"javaScriptWindowObjectCleared"信号连接到您的插槽。

假设您使用的是 PyQt 的 Widget 编码风格(然后没有 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)