QWebEnginePage и javascript (окончание работы скрипта)

Модератор: Модераторы разделов

Аватара пользователя
devilr
Сообщения: 1695
ОС: Mandriva => Gentoo (~amd64)

QWebEnginePage и javascript

Сообщение devilr » 07.01.2019 01:43

Можно ли как либо отследить окончание работы javascript на html-странице?
Т.е. саму загрузку страницы отследить то запросто (сигнал loadFinished(bool ok)), а вот как отследить окончание работы скрипта, который находится на той же странице? Скрипт ведь может иметь время работы больше, чем время загрузки всей страницы.
Может кто подобное делал или где-то сталкивался?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

azsx
Сообщения: 2722
ОС: calculate linux, debian, ubuntu

Re: QWebEnginePage и javascript

Сообщение azsx » 07.01.2019 17:08

Может в конце скрипта аякс запрос отправить какой нибудь?
https://javascript.ru/ajax/transport
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 1695
ОС: Mandriva => Gentoo (~amd64)

Re: QWebEnginePage и javascript

Сообщение devilr » 07.01.2019 17:24

Не совсем понятно, что вы хотели предложить. Допустим, на странице имеется долгоиграюший скрипт, который, к в тому же, где-то в коде имеет оператор return. Т.е. даже если проанализировать скрипт и добавить вызов чего-либо в конец скрипта - оно может и не сработать.
Или я что-то неправильно понимаю?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4820
ОС: Gentoo

Re: QWebEnginePage и javascript

Сообщение /dev/random » 07.01.2019 17:43

Всё зависит от ситуации.

Если вы работаете с чужой страницей, не контролируя или не полностью контролируя её содержимое, то я не думаю, что это возможно. Проблема в том, что непонятно, что считать окончанием работы скриптов. Если достижение интерпретатором байткода конца тега <script>, то это, насколько я знаю, уже включено в loadFinished. Вот только большинство скриптов к этому времени даже не начинает свою основную работу. Вместо этого они вешают обработчики на какие-нибудь события (onload, таймеры, завершение сделанных из js запросов и т.д.) и выполняют работу в них. В свою очередь, эти обработчики могут повесить ещё обработчики, и ещё. Для многих сайтов эта цепочка не завершается никогда, и только сам скрипт знает, когда он завершил работу по инициализации страницы и начал работу по её поддержанию.

Если вы показываете собственную страницу, сгенерированную тем же приложением, которое создаёт QWebEnginePage, и при этом скрипт полностью синхронный, без обработчиков событий, то я рекомендую не включать скрипт в страницу, а запускать его через runJavaScript(). Этот метод поддерживает уведомление о завершении основного блока - но, разумеется, не асинхронных блоков.

Если страница ваша, но или скрипт асинхронный, или вам по какой-то причине необходимо включить его прямо в страницу, то перепишите его так, чтобы он уведомлял приложение, как только решит, что его работа завершена. Например, через QWebChannel. Как я уже написал выше, только сам скрипт способен знать, когда пора отправлять это уведомление.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 1695
ОС: Mandriva => Gentoo (~amd64)

Re: QWebEnginePage и javascript

Сообщение devilr » 07.01.2019 17:52

В том то и проблема, что скрипт - чужой. На чужой страничке.
И я, именно что подгружаю свой скрипт через runJavaScript() при окончании загрузки страницы. Страничка то загрузится и я это успешно перехвачу, но внутри может быть скрипт, который может изменить эту страничку в будущем (например, как те самые "до окончания сезона скидок осталось 00:01:35"). А вот отловить окончание работы такого скрипта у меня и не получается.
Вот я и спросил, может есть какая идея на эту тему?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали: