Я работаю над интегрированием браузера без заголовка PhantomJS в мой проект (в настоящее время использующий версию 1.6). По большей части, он отлично справляется с выполнением того, что мне нужно выполнить. Однако асинхронный характер того, как работают вызовы WebPage.open(), и необходимость вызова phantom.exit() в какой-то момент, затрудняет обработку переадресаций на стороне клиента, когда вы не можете предвидеть, собираюсь идти.
То, что мне нужно, это способ вызвать phantom.exit() только после того, как все мета обновится (что приведет к другой странице), и JavaScript-перенаправления, связанные с такими вещами, как onload-события, были выполнены. Я понимаю, почему это проблема, потому что теоретически переадресация на стороне клиента может проходить через какое-то количество секунд после загрузки страницы, и я не могу просто попросить возможность выйти только тогда, когда больше не будет перенаправлений, Прямо сейчас самое лучшее решение, о котором я могу думать, - это: a) вручную определить наличие элементов метаобновления на странице и разобраться с ними самостоятельно; b) использовать setInterval(), чтобы позволить некоторое разумное количество времени (например, 1- 1,5 секунды) до вызова phantom.exit(). В основном это будет выглядеть так:
var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
new Date() - pageOpenedTime >= 1500)
{
phantom.exit();
}
), 1000);
page.open(url, function() {
pageOpenedTime = new Date();
if (!hasMetaRefresh(page)) {
visitComplete = true;
}
});
function hasMetaRefresh(page) {
// Query the DOM here to detect meta refresh elements
}
Любые лучшие идеи?
Изменить: я должен упомянуть, что я впервые подумал, что может произойти событие PhantomJS, которое запускается, когда JavaScript, связанный с начальной загрузкой страницы, был выполнен, но обратный вызов onLoadFinished, как представляется, предшествует исполнению любой встроенной страницы JavaScript, включая события onload. Я также немного тестировал, сколько времени мне нужно подождать, и хотя 1000 мс достаточно долго для перенаправления JavaScript (через событие onload тела), чтобы выполнить выполнение на небольшой тестовой странице, 100 мс было недостаточно.