Подтвердить что ты не робот

Как узнать, когда загружается веб-страница при использовании QtWebKit?

Оба QWebFrame и QWebPage имеют void loadFinished(bool ok) сигнал, который можно использовать для обнаружения, когда веб-страница полностью загружена. Проблема заключается в том, что на веб-странице некоторое содержимое загружается асинхронно (ajax). Как узнать, когда страница полностью загружена в этом случае?

4b9b3361

Ответ 1

Я на самом деле этого не делал, но думаю, что вы сможете достичь своего решения, используя QNetworkAccessManager.

Вы можете получить QNetworkAccessManager из своего QWebPage с помощью networkAccessManager(). QNetworkAccessManager имеет сигнал завершен (QNetworkReply * reply), который запускается всякий раз, когда файл запрашивается экземпляром QWebPage.

Сигнал finished дает вам экземпляр QNetworkReply, из которого вы можете получить копию исходного запроса, чтобы идентифицировать запрос.

Итак, создайте слот для присоединения к сигналу finished, используйте методы переданного QNetworkReply, чтобы выяснить, какой файл только что закончил загрузку, и если это ваш запрос Ajax, выполните любую обработку, которую вам нужно сделать.

Мое единственное предостережение в том, что я никогда не делал этого раньше, поэтому я не уверен на 100%, что он сработает.

Другой альтернативой может быть использование методов QWebFrame для вставки объектов в объектную модель страницы, а также вставки некоторого JavaScript, который затем уведомляет ваш объект, когда запрос Ajax завершен. Это немного хакерский способ сделать это, но должен определенно работать.

EDIT:

Второй вариант кажется мне лучше. Рабочий процесс выглядит следующим образом:

Присоедините слот к сигналу QWebFrame:: javascriptWindowObjectCleared(). На этом этапе вызовите QWebFrame:: оценитеJavascript(), чтобы добавить код, похожий на следующий:   window.onload = function() {//полностью загружена страница}

Поместите любой код в эту функцию. Возможно, вам захочется добавить QObject на страницу через QWebFrame:: addToJavaScriptWindowObject(), а затем вызвать функцию на этом объекте. Этот код будет выполняться только при полной загрузке страницы.

Надеюсь, это ответит на вопрос!

Ответ 2

Когда ваш начальный html/images/etc заканчивает загрузку, то это. Он полностью загружен. Этот факт не изменится, если вы затем решите использовать некоторый javascript для получения дополнительных данных, просмотров страниц и т.д. После факта.

Тем не менее, я подозреваю, что вы хотите сделать здесь, это открыть объект/интерфейс QtScript для вашего вида, который вы можете вызвать со своей страницы script, эффективно предоставляя "обратный вызов" на свой С++, как только вы это решите ( со страницы script), что у вас "полностью загружен".

Надеюсь, это поможет дать вам направление попробовать...

Ответ 3

Чтобы проверить загрузку конкретного элемента, вы можете использовать QTimer. Что-то вроде этого в python:

@pyqtSlot()
def on_webView_loadFinished(self): 
    self.tObject = QTimer()
    self.tObject.setInterval(1000)
    self.tObject.setSingleShot(True)
    self.tObject.timeout.connect(self.on_tObject_timeout)
    self.tObject.start()

@pyqtSlot()
def on_tObject_timeout(self):
    dElement = self.webView.page().currentFrame().documentElement()
    element  = dElement.findFirst("css selector")
    if element.isNull():
        self.tObject.start()

    else:
        print "Page loaded"

Ответ 4

OP думал, что это связано с задержкой запросов AJAX, но также может быть и другая причина, которая также объясняет, почему очень короткая временная задержка устраняет проблему. Существует ошибка, которая вызывает описанное поведение:

https://bugreports.qt-project.org/browse/QTBUG-37377

Чтобы обойти эту проблему, сигнал loadFinished() должен быть подключен с использованием очереди в очереди.