Почему 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, который срабатывает только один раз.

 
Interesting Posts for Van-Lav

Передача массивов numpy в Cython на функцию C, которая требует динамически распределенных массивов

Одновременно используйте функции ввода () и print () (например, в чате)

Печать очень большой в научной нотации в python

Попытка опубликовать данные о многочастной форме в python, не будет публиковать

Тест, если массив numpy содержит только нули

ТипError при преобразовании словаря в массив JSON

импортировать pygame не удается

Как определить владельца файла в Windows с помощью python без pywin32

Интерполяция дает разные результаты для почти идентичных массивов

Как сделать поле в OpenERP необходимым только для определенного состояния рабочего процесса?

Как добавить внешний объект в качестве панели полей в Wagtail CMS

как динамически обновлять график в цикле в ноутбуке ipython (в одной ячейке)

Скриншот цветовое усреднение прямоугольников

Нечеткий текстовый поиск python

Путь Python в .bash_profile не соблюдается

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