2013-12-05 4 views
0

У меня есть одна страница в моем тесте casperjs, у которой есть изображения, я не хочу ждать, пока эта страница не загрузится, чтобы перейти к следующему шагу. Как мне это сделать ? я судимый этого путьCasperJS skip step on timeout

var casper = require("casper").create({ 
    onStepTimeout: function() { 
         this.echo("TIMEOUT" + this.requestUrl,"RED_BAR"); 
    // Some skip page controlling code 
    }, 
); 
var timeout = ~~casper.cli.get(0); 

casper.start("http://127.0.0.1/index2.php", function() { 
    this.echo("FIRST GOOD PAGE", "GREEN_BAR"); 
    casper.options.stepTimeout = timeout; 
}); 

casper.thenOpen("http://127.0.0.1/slowpage.php", function() { 
     this.echo("SECOND PAGE LOADED - I want to be called even have received Timeout!", "GREEN_BAR"); 
}); 

casper.then(function() { 
    this.echo("THEN!", "GREEN_BAR"); 
}); 

Но Каспер просто вызывает onStepTimeout до тех пор, пока загружается slopage.php.

+0

Не можете ли вы сконфигурировать casperjs так, чтобы он не загружал изображения? http://docs.casperjs.org/ru/latest/modules/casper.html#pagesettings – rusln

ответ

8

Вы можете добавить request.abort(); в шаге Casper, чтобы закончить шаг и перейти к следующему шагу:

casper.then(function() { 
    request.abort(); 
    this.echo('You will never see me'); 
}); 

casper.then(function() { 
    this.echo('I execute next'); 
}); 

Вы также можете проверить, если вы хотите прервать на основе open запроса. Эта функция будет проверять URL на матч, а затем прервать до открытия и возвращает код статуса HTTP:

casper.on('page.resource.requested', function(requestData, request) { 
    if (requestData.url.indexOf('slowpage.php') !== -1) { 
     request.abort(); 
    } 
}); 

Вы можете изменить waitTimeout и stepTimeout настройки. Кроме того, под pageSettings вы можете заставить casper загружать изображения. Пример:

var casper = require('casper').create ({ 
    waitTimeout: 10000, 
    stepTimeout: 10000, 
    verbose: true, 
    viewportSize: { 
     width: 1400, 
     height: 768 
    }, 
    pageSettings: { 
     "userAgent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.10 (KHTML, like Gecko) Chrome/23.0.1262.0 Safari/537.10', 
     "loadImages": false, 
     "loadPlugins": false,   
     "webSecurityEnabled": false, 
     "ignoreSslErrors": true 
    }, 
    onWaitTimeout: function() { 
     //throw new Error 
    }, 
    onStepTimeout: function() { 
     //throw new Error 
    } 
}); 

Вы можете использовать Casper waitFor ждать, пока страница полностью загрузится. Только return true. Он даже имеет свою собственную функцию timeout. Таким образом, вы могли бы сделать что-то вроде этого:

casper.waitFor(function check() { 
    casper.thenOpen("http://127.0.0.1/slowpage.php", function() { 
     //+++ casper will wait until this returns true to move forward. 
     //+++ The default timeout is set to 5000ms 
     this.evaluate(function() { 
      //checks for element exist 
      if (document.getElementById('someElement')) { 
      console.log('Im loaded!'); 
      return true; 
      } 
     }); 
    }); 
}, function then() { // step to execute when function check() is ok 
    //+++ executes ONLY after the 'casper.thenOpen' returns true. 
    this.echo("THEN!", "GREEN_BAR"); 
}, function timeout() { // step to execute if check has failed 
    //+++ code for on timeout. This is different than onStepTimeOut. 
},1000);// custom timeOut setting. 
+0

Изображения не являются проблемой - настоящая проблема - это javascripts и css. Но то, что я действительно хочу сделать, - это возможность «пропустить шаг» (но не исключать исключение кулаком и т. Д.) После таймаута. – Oleg

+0

В любое время во время 'then' вы можете использовать' abort.request(); 'для завершения шага. Кроме того, если вы хотите получить http-статус URL-адреса, вы можете сделать чек на событии 'page.resource.requested'. Я добавил несколько примеров. –

+1

Я не могу найти ни 'abort.request', ни' request.abort' в контексте шага casper. Если вы не уточните свой ответ, я считаю его неправильным или вводящим в заблуждение. Единственное, что работает для меня, это размещение 'this.page.stop' в' onStepTimeout'. – Stan

5

Действительно, в некоторых случаях стадий а CasperJS может иногда истекает время ожидания (если stepTimeout задается в настройках) из-за проблемы с подключением. Поведение по умолчанию - остановить CasperJS на this.die. Если требуется не останавливать CasperJS, а скорее продолжать выполнение следующих шагов, следует предоставить пользовательский номер onStepTimeout. К сожалению, request.abort не определен в этом контексте, поскольку request доступен только в обработчике onResourceRequested (поэтому ответ @Topher Ellis сомнительный). Другими словами, request.abort полезен для предотвращения выдачи нового запроса, но не может остановить запрос, который уже выполняется (и может быть потенциально тайм-аутом). В таких ситуациях я использую следующий код:

var casper = require("casper").create(
{ 
    ... 
    onStepTimeout: function(timeout, step) 
    { 
    this.echo('step timeout'); 
    this.clear(); 
    this.page.stop(); 
    } 
}); 

Надеюсь, это поможет.