为什么QWebView.loadFinished在某些网站如YouTube上被多次调用?

5 投票
2 回答
4947 浏览
提问于 2025-04-17 09:46

根据文档,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)

撰写回答