为什么QWebView.loadFinished在某些网站如YouTube上被多次调用?
根据文档,loadFinished 这个事件应该在所有页面元素加载完成后才会被触发。这意味着它应该只被调用一次,但我发现像 youtube.com 这样的某些网站上,它却被调用了两次?有没有其他方法可以解决这个问题,或者有什么更可靠的方法来检测页面加载事件?
这是测试代码:
import sys
from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4.QtCore import QUrl
from PyQt4.QtGui import QApplication
def onDone(val):
print "Done ...",val
def onStart():
print "Started..."
app = QApplication(sys.argv)
ui = QtWebKit.QWebView()
ui.loadStarted.connect(onStart)
ui.loadFinished.connect(onDone)
ui.load(QUrl("http://www.youtube.com"))
ui.showMaximized()
sys.exit(app.exec_())
输出结果:
Started...
Done ... True
Started...
Done ... True
补充:有一个几乎相同的问题,但它已经超过两年了,仍然没有人回答。
2 个回答
3
我很确定,当你像处理字符串一样修改网页的结构(DOM)时,就会出现这种情况。我相信QWebKit会运行JavaScript代码,所以它可能会在完成后(onDone())修改网页的结构。
你可能应该创建一个叫做onDoneFirst的方法,这个方法只会执行一次。
5
每当一个页面加载时,load*
信号会被触发一次。
如果你只想捕捉到第一次触发的信号,可以连接到主框架的相应信号:
ui.page().mainFrame().loadStarted.connect(onStart)
ui.page().mainFrame().loadFinished.connect(onDone)
你可以通过连接到frameCreated
信号来确认其他框架是否正在加载,这个信号会在主框架加载后,为每一个新创建的子框架触发一次:
def onFrame(val):
print 'Frame Created:', val.frameName()
ui.page().frameCreated.connect(onFrame)