根据文档,只有在所有页面元素完成加载后才应发出 loadFinished。这应该意味着它只会被调用一次,但是我注意到在某些网站(例如 youtube.com)上,它会被调用两次?有没有其他方法可以解决这个 bug 或者检测 page.load 事件的最可靠方法是什么?
这是测试代码:
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 岁了,但仍然没有答案。
每加载一个帧,
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)
我非常确定当你修改 DOM 时会发生这种情况,就像它是一个字符串一样。我确信 QWebKit 运行 JS 代码,因此它可以在 onDone() 之后修改 DOM。
您可能应该创建一个仅触发一次的 onDoneFirst 方法。