QWebPage - 获取资源列表/验证页面加载没有错误

时间:2012-05-03 16:48:41

标签: python qt webkit pyside qtwebkit

我正在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检查器可以列出资源......

Bonus:我还想知道页面中是否有任何JavaScript错误,我该怎么做?

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是首先创建一个继承自QNetworkManager的新类,该类将覆盖QNetworkAccessManager::createRequest。在您的createRequest函数中,您将首先调用base / super类来获取请求,然后连接到QNetworkReply::error信号或QNetworkReply::finished并检查QNetworkReply::error函数。

然后,您使用QWebPage::setNetworkAccessManager在QWebPage上设置此自定义QNetworkAccessManager

要拦截JavaScript消息,您需要创建一个继承自QWebPage的新类,该类将覆盖QWebPage::javaScriptConsoleMessage。任何错误或对console.log的调用都将传递给此函数:

  

只要JavaScript程序尝试将消息打印到Web浏览器的控制台,就会调用此函数。   例如,在评估错误的情况下,源URL可以在sourceID以及lineNumber中提供。

注意:这个答案假设PySide提供了完整的Qt API,我实际上没有在Python中检查这是可能的,但这是我之前在C ++中做过类似事情的方式。 < / p>