Тайм-аут веб-страницы phantomJS

Я настроил скрипт для создания веб-шотов нашего приложения. Он работает отлично, и все в порядке, пока я не сталкиваюсь с изображением с неработающим URL-адресом:

 "<img src='http://testserver.our.intranet/fetch/image/373e8fd2339696e2feeb680b765d626e' />"

Мне удалось сломать скрипт через 6 секунд, используя приведенное ниже, прежде чем он просто зацикливался навсегда.

Но можно ли проигнорировать сетевой запрос (AKA извлечь изображение из DOM), а затем приступить к созданию миниатюры без изображения (или с отсутствующим изображением введенного изображения!)

var page = require('webpage').create(),
    system = require('system'),
    address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
    phantom.exit(1);
} else {
    address = system.args[1];
    output  = system.args[2];
    page.viewportSize = { width: 640, height: 640 };
    page.zoomFactor = 0.75;
    page.clipRect = { top: 10, left: 0, width: 640, height: 490 };
    try{
        page.open(address, function (status) {
            if (status !== 'success') {
                console.log('Unable to load the address!');
                phantom.exit();
            } else {
                window.setTimeout(function () {
                    page.render(output);
                    phantom.exit();
                }, 200);
            }
        });    
    } finally{
        setTimeout(function() {
            console.log("Max execution time " + Math.round(6000) + " seconds exceeded");
            phantom.exit(1);
        }, 6000);
    }
}

person Kim Isaksen    schedule 31.05.2013    source источник
comment
Это отличный вопрос. У нас похожая проблема, но ее немного сложнее решить. У нас есть веб-сайт клиента с пользовательским javascript, который плохо написан. Кажется, это приводит к зависанию webkit. У нас есть огромное количество веб-сайтов, которые мы хотим протестировать, но это не сработает, если пользовательский js клиента ломает webkit. Таймер obj - хорошее решение, но мне интересно, есть ли у кого-нибудь решение diff. ... ?   -  person cliffbarnes    schedule 19.06.2013


Ответы (1)


В PhantomJS 1.9 появился новый параметр resourceTimeout, который определяет, сколько времени может занять запрос, прежде чем он будет отменен. Наряду с этим существует событие onResourceTimeout, которое запускается, если/когда истекает время ожидания запроса.

Вот фрагмент кода, иллюстрирующий все вышеперечисленное:

var page = require('webpage').create();  
page.settings.resourceTimeout = 5000; // 5 seconds
page.onResourceTimeout = function(e) {
  console.log(e.errorCode);   // it'll probably be 408 
  console.log(e.errorString); // it'll probably be 'Network timeout on resource'
  console.log(e.url);         // the url whose request timed out
  phantom.exit(1);
};

page.open('http://...', function (status) {
...
}

К сожалению, эти параметры плохо документированы прямо сейчас. Мне пришлось просмотреть обсуждения на GitHub и исходный код PhantomJS, чтобы найти их.

person Michael Benford    schedule 16.09.2013
comment
Предполагается, что resourceTimeout завершает вызванный процесс phantomjs. Потому что для меня это не так. Процесс phantomjs просто зависает на неопределенный срок. - person Donato; 12.06.2015
comment
@Donato Я думаю, что resourceTimeout генерирует только какое-то событие, которое можно обработать в page.onResourceTimeout - person Scadge; 18.08.2015
comment
По крайней мере, в версии 1.9.8 resourceTimeout прерывает процесс - поэтому PDF поврежден, но процесс не зависает. Я также регистрирую, какой ресурс вызвал проблему, используя page.onResourceTimeout = function(request)... - person Gerfried; 08.03.2016
comment
Использование page.onResourceTimeout = ...; не поддерживается. Вместо этого используйте page.property('onResourceTimeout', ...). См. файл README для получения дополнительных примеров page#property. - person user1709076; 10.04.2019