2012-04-10 13 views
3

私はQtWebkit/Spynnerを使ってPythonでテスト作業を行ってきました。 QtWebKitはChromeのWebkitと同じようにJavascriptをサポートしていますので、には、のように、Chromeの通常のユーザースクリプトと同じように、userscriptまたはjavascriptを挿入できますか?QtWebKit - Userscript/Javascript Injection

うまくいけば、それらの経験のための簡単な質問!前もって感謝します!

答えて

2

次のアプローチを使用することができます。

  1. 、そのイベントハンドラ内QWebPage.frameCreated
  2. 用のハンドラを登録し、第2イベントハンドラでQWebFrame.javaScriptWindowObjectCleared
  3. のための新しいイベントハンドラを登録し、QWebFrame.evaluateJavaScriptを使用する(またはSpynnerのrunjsメソッド)を使用してJavascriptを実行します。

capybara-webkitがユーティリティスクリプトを実行する方法です。残念ながら、私はQt Pythonバインディングに慣れていないので、Pythonコードの例を挙げることはできません。前の回答(のNiklas B.)から

0

: はカピバラ、WebKitの信号スロット(frameCreated-javaScriptWindowObjectCleared)のない有用な二重のサブスクリプションを使用し、injectJavascriptHelpersに送信者()()関数の呼び出しを使用しますデカップリングされたコードの良い習慣ではありません。

実際には、mainFrame()からの "javaScriptWindowObjectCleared"シグナルをスロットに接続するだけで済みます。

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) 
:あなたはPyQtは(当時なしQML)のための 古いウィジェットのコーディングスタイルを使用していると仮定すると