CasperJS пропустить шаг по тайм-ауту

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

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.


person Oleg    schedule 05.12.2013    source источник
comment
вы не можете просто настроить casperjs так, чтобы он не загружал изображения? docs.casperjs.org/en/latest/modules/casper.html# настройки страницы   -  person rusln    schedule 05.12.2013


Ответы (2)


Вы можете добавить 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 можно сделать так, чтобы каспер не загружал изображения. Пример:

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.
person Christopher Ellis    schedule 05.12.2013
comment
Изображения не проблема - настоящая проблема - это javascripts и css. Но что я действительно хочу сделать, так это иметь возможность пропустить шаг (но не исключение исключения и т. д.) после тайм-аута. - person Oleg; 05.12.2013
comment
В любой момент во время then вы можете использовать abort.request(); для завершения шага. Кроме того, если вы хотите получить http-статус URL-адреса, вы можете проверить событие page.resource.requested. Я добавил несколько примеров. - person Christopher Ellis; 05.12.2013
comment
Я не могу найти ни abort.request, ни request.abort в контексте шага каспера. Если вы не уточните свой ответ, я сочту его неверным или вводящим в заблуждение. Единственное, что у меня работает, это поместить this.page.stop в onStepTimeout. - person Stan; 18.09.2014
comment
@Стэн, я не уверен, что ты имеешь в виду. В предоставленном ответе есть пример abort.request(). документация для abort.request() находится в разделе событий и фильтров. - person Christopher Ellis; 19.09.2014
comment
Да, это пример обработчика onResourceRequested. Этот контекст отличается от контекста внутри шага Каспера. В примере отменяется новый запрос до его отправки, но он не подходит для отмены запроса, который уже отправлен и (вероятно) истек по тайм-ауту. - person Stan; 19.09.2014

Действительно, в некоторых случаях шаг 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();
  }
});

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

person Stan    schedule 19.09.2014