4

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

希望对这些经验有一个简单的问题!提前致谢!

4

2 回答 2

3

您可以使用以下方法:

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

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

于 2012-04-10T20:48:48.403 回答
1

从上一个答案(Niklas B.)来看:水豚 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)
于 2014-09-29T09:51:54.117 回答