¿Por qué se llama varias veces a QWebView.loadFinished en algunos sitios, por ejemplo, youtube?

Según la documentación, loadFinished debe emitirse solo después de que todos los elementos de la página hayan terminado de cargarse. Esto debería significar que solo se llamará una vez, sin embargo, me he dado cuenta de que en algunos sitios como youtube.com, ¿se llama dos veces? ¿Hay alguna otra forma de evitar este error o cuál es la forma más confiable de detectar el evento page.load?

Aquí está el código de prueba:

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_()) 

La salida:

 Started... Done ... True Started... Done ... True 

Edit: Hay una pregunta casi igual , pero tiene más de 2 años y aún no ha sido respondida.

Las señales de load* se activan una vez por cada cuadro que se carga.

Para capturar solo el primer conjunto de señales, conéctese a las señales correspondientes del marco principal:

 ui.page().mainFrame().loadStarted.connect(onStart) ui.page().mainFrame().loadFinished.connect(onDone) 

Puede verificar que otros marcos se estén cargando conectándose a la señal frameCreated , que se activará una vez por cada marco posterior creado después de que el marco principal se haya cargado:

 def onFrame(val): print 'Frame Created:', val.frameName() ui.page().frameCreated.connect(onFrame) 

Estoy bastante seguro de que eso sucede cuando modificas el DOM como si fuera una cadena. Estoy seguro de que QWebKit ejecuta el código JS, por lo que podría modificar el DOM después de que estuviera onDone ().

Probablemente debería crear un método onDoneFirst que solo se dispara una vez.