javascript — Heisenbug с собственным безголовым браузером

Я работаю над безголовым браузером на основе WebKit (использующим C ++ / Qt4) с поддержкой JavaScript. Основной целью для этого является возможность создания HTML-сайтов, которые в значительной степени основаны на JavaScript (см. Backbone.js или любой другой JavaScript MVC).

Я знаю, что нет никакого способа узнать когда страница полностью загружена (см. этот вопрос) и из-за этого, после того как я получу loadFinished сигнал (документы Вот) Я создаю таймер и начинаю опрашивать содержимое DOM (как при проверке каждые X мс содержимого DOM), чтобы увидеть, были ли какие-либо изменения. Если там не было, я предполагаю, что страница была загружена и распечатать результат. Пожалуйста, имейте в виду, что я уже знаю, что это не почти идеальное решение, но это единственное, о чем я мог подумать. Если у вас есть идея получше, пожалуйста, ответьте этот вопрос

ПРИМЕЧАНИЕ. Таймер не блокирует, что означает, что все, что работает внутри WebKit, никоим образом не должно быть затронуто / заблокировано / приостановлено.

После тестирования безголового браузера с некоторыми страницами все работает нормально (или, по крайней мере, так, как ожидалось). Но вот где появляется гейзенбаг. Безголовый браузер должен вызываться из сценария PHP, который должен подождать (блокировать вызов) некоторый вывод и затем распечатать его.

На моем тестовом компьютере (Apache 2.3.14, PHP 5.4.6) при запуске сценария PHP выводится желаемый результат, иначе говоря, браузер без монитора выбирает веб-сайт, запускает JavaScript и печатает то, что увидит пользователь; но, запустив тот же сценарий на рабочем сервере, получит веб-сайт, запустите немного кода JavaScript и распечатать результат.

Исходный код безголового браузера и сценария PHP, который я использую, можно найти Вот.

ПРИМЕЧАНИЕ. Таймер (как вы можете видеть в исходном коде браузера без монитора) установлен на 1 с, но установка большего количества времени не решает проблему.

ПРИМЕЧАНИЕ 2: Перехват всех ошибок JavaScript ничего не показывает, так что это не из-за отсутствующей функции, неправильных аргументов или любого другого типа неправильного кода.

Я тестирую безголовый браузер с 2 сайтами.
Вот этот работает как на моей тестовой машине, так и на рабочем сервере, в то время как этот работает только на моей тестовой машине.

Я больше склонен думать, что это какая-то странная ошибка в коде JavaScript на втором веб-сайте, а не в коде безголового браузера, поскольку он генерирует идеальный HTML-снимок первого веб-сайта, но, опять же, это heisenbug, так что я не совсем уверен, что все это вызывает.

Любые идеи / комментарии будут оценены. Спасибо

5

Решение

Вместо того, чтобы опросить изменения DOM, почему бы не посмотреть сетевые запросы? Это похоже на более безопасную эвристику в использовании. Если в течение X мс не было сетевой активности (и нет ожидающих запросов), то предположим, что страница полностью «загружена».

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]