Почему QWebView.loadFinished вызывается несколько раз на некоторых сайтах, например youtube?

В соответствии с документацией loadFinished следует выпустить только после того, как все элементы страницы завершили загрузку. Это должно означать, что он будет вызван только один раз, однако я заметил, что на некоторых сайтах, таких как youtube.com, он вызывается дважды? Есть ли другой способ обойти эту ошибку или самый надежный способ обнаружения события 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 

Редактировать: Есть почти такой же вопрос, но его> 2yrs старый и все еще без ответа.

2 Solutions collect form web for “Почему QWebView.loadFinished вызывается несколько раз на некоторых сайтах, например youtube?”

Сигналы 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-код, поэтому он может изменить DOM после того, как он был onDone ().

Вероятно, вы должны создать метод onDoneFirst, который срабатывает только один раз.

    Python - лучший язык программирования в мире.