Почему 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 старый и все еще без ответа.

  • Проблема загрузки определенного веб-сайта через Qt Webkit
  • Как выбрать значение из списка опций с помощью PyQt4.QtWebKit
  • Pyside: addToJavaScriptWindowObject не работает должным образом, когда приложение скомпилировано с помощью cython
  • Как установить размер браузера с помощью QtWebKit
  • ImportError: нет модуля с именем QtWebKit
  • Переопределить ifInterruptJavaScript в QWebPage с помощью PySide
  • 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

    C ++ – Как читать символы Unicode (например, Hindi Script) с использованием C ++ или есть лучший способ с помощью какого-то другого языка программирования?

    Получить адреса локального сетевого интерфейса, используя только proc?

    Таблицы Django – Фильтрация столбцов

    Конфигурация Remote_api с App Engine

    Как установить и импортировать модули Python во время выполнения?

    Сумма всех счетов в коллекциях.

    Преобразование двух списков в матрицу

    получить список сообщений в django

    django-allauth возвращает ошибку «Обратный … с аргументами () и аргументами ключевого слова '{}' not found"

    Python Sqlite3 – данные не сохраняются постоянно

    Пользовательский сортировочный словарь Python

    Что-то о `namedtuple` изменилось в 3.5.1?

    Как я могу эффективно обрабатывать массив numpy в блоках, подобных функции blkproc (blockproc) Matlab

    Почему я получаю уродливые фигурные скобки вокруг моего текста в виджетах ярлыков? – Tkinter

    Как открыть интерпретатор IPython в emacs?

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