2012-05-03 42 views
0

我正在PySide中加載一個網頁。我希望能夠看到它是否已成功加載而沒有錯誤。如果我得到一個錯誤,那麼我想知道它。我不能簡單地使用加載完成信號的「成功」參數,因爲它似乎總是表示成功。我知道如何做到這一點的唯一方法,就是做這樣的事情:QWebPage - 獲取資源列表/驗證頁面沒有錯誤加載

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錯誤,我該怎麼做?

回答

1

做到這一點的一種方法是首先創建一個繼承自QNetworkManager的新類,該類覆蓋QNetworkAccessManager::createRequest。在您的createRequest函數中,您將首先調用base/super類來獲取請求,然後連接到QNetworkReply::error信號或QNetworkReply::finished並檢查QNetworkReply::error函數。

然後您在QWebPage上將此自定義QNetworkAccessManager設置爲QWebPage::setNetworkAccessManager

要攔截JavaScript消息,您將創建一個繼承自QWebPage的新類,該類將覆蓋QWebPage::javaScriptConsoleMessage。任何錯誤或調用console.log將被傳遞給這個函數:

該功能被稱爲每當一個JavaScript程序試圖打印一條消息到Web瀏覽器的控制檯。 例如,如果發生評估錯誤,可能會在sourceID和lineNumber中提供源URL。

注:這個回答假設PySide提供了完整的Qt API,我還沒有實際檢查這是可能在Python,但它是我以前在C++做過類似的事情的方式。