Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
133 views
in Technique[技术] by (71.8m points)

javascript - CasperJS skip step on timeout

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...