0

PySideにウェブページを読み込んでいます。エラーなしで正常にロードされたかどうかを確認できるようにしたいと思います。エラーが発生した場合は、それについて知りたいです。常に成功を示しているように見えるため、ロード終了シグナルに「成功」​​パラメーターを単純に使用することはできません。私がそれを行う方法を知っている唯一の方法は、次のようなことをすることです:

class WebPageResourceTracker(
    PySide.QtCore.QObject
):
    def __init__(self, url):
        PySide.QtCore.QObject.__init__(self)
        self.page = PySide.QtWebKit.QWebPage()
        self.frame = self.page.currentFrame()

        # The reason for the lambda is that otherwise I get this:
        #ASSERT: "self" in file /var/tmp/portage/dev-python/pyside-1.1.0/work/pyside-qt4.7+1.1.0/libpyside/signalmanager.cpp, line 534
        self.frame.loadFinished.connect(lambda ok: self.onLoadFinished(ok))
        self.page.networkAccessManager().finished.connect(lambda reply: self.onResourceFinished(reply))

        self.frame.setUrl(
            PySide.QtCore.QUrl(
                url,
            )
        )


    def onLoadFinished(self, ok):
        print 'onLoadFinished', ok

    def onResourceFinished(self, reply):
        print 'onResourceFinished', reply.url().toString(), reply.error()



import sys
from PySide import QtGui

app = QtGui.QApplication(sys.argv)
#WebPageResourceTracker("http://google.com")
WebPageResourceTracker(
    "http://migration.tanagerproductions.com/broken.html"
)
sys.exit(app.exec_())

しかし、Webkitインスペクターはリソースを一覧表示できるため、ページのリソースのリストに直接アクセスする方法があると思います...

ボーナス:ページにJavaScriptエラーがあるかどうかも知りたいのですが、どうすればよいですか?

4

1 に答える 1

1

これを行う1つの方法は、最初に、QNetworkManagerそのオーバーライドを継承する新しいクラスを作成することQNetworkAccessManager::createRequestです。createRequest関数では、最初にベース/スーパークラスを呼び出してリクエストを取得し、次にQNetworkReply::errorシグナルに接続するか、関数QNetworkReply::finishedをチェックしQNetworkReply::errorます。

次に、このカスタムQNetworkAccessManagerをQWebPageで。を使用して設定しQWebPage::setNetworkAccessManagerます。

QWebPageJavaScriptメッセージをインターセプトするには、そのオーバーライドを継承する新しいクラスを作成しますQWebPage::javaScriptConsoleMessage。エラーまたはへの呼び出しはconsole.log、この関数に渡されます。

この関数は、JavaScriptプログラムがWebブラウザのコンソールにメッセージを出力しようとするたびに呼び出されます。たとえば、評価エラーの場合、ソースURLはlineNumberだけでなくsourceIDでも提供される場合があります。

注:この回答は、PySideが完全なQt APIを提供することを前提としています。これがPythonで可能かどうかは実際には確認していませんが、これは以前にC++で同様のことを行った方法です。

于 2012-05-03T19:41:12.343 に答える