CasperJS skip step on timeout

独自空忆成欢 提交于 2019-11-26 23:26:17

问题


I have one page in my casperjs test that has images , I dont what to wait until this page loaded to go to the next step. How can I do it ? I have tryed this way

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"); 
});

But it casper just calls onStepTimeout until slopage.php is loaded.


回答1:


You can add request.abort(); in a casper step to end the step and proceed to the next step:

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

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

You can also check if you want to abort based on open request. This function will check the url for a match and then abort before opening and will return an http status code:

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

You can change the waitTimeout and stepTimeout settings. Also, under pageSettings you can make casper not load images. Example:

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
    }
});

You can use casper waitFor to wait until the page has completely loaded. Just return true. It even has its own timeout function. So you could do something like this:

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.



回答2:


Indeed, in some cases a CasperJS's step can occasionally expire by timeout (if stepTimeout is specified in the settings) due to problems with connection. Default behaviour is to stop CasperJS by this.die. If it's required to not stop CasperJS, but rather continue executing next steps, one should provide a custom onStepTimeout. Unfortunately, request.abort is not defined in this context, because request is only accessible inside onResourceRequested handler (this is why the answer of @Topher Ellis is questionable). In other words, request.abort is useful to prevent a new request from being issued, but can not stop a request which is already in progress (and can be potentially timed out). For such situations I'm using the following code:

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

Hope this helps.



来源:https://stackoverflow.com/questions/20399453/casperjs-skip-step-on-timeout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!