如何获取Casper.js的HTTP状态码?

10

我有以下简单的代码:

var casper = require("casper").create({
    }),
    utils = require('utils'),
    http = require('http'),
    fs = require('fs');

casper.start();

casper.thenOpen('http://www.yahoo.com/', function() {
    casper.capture('test.png');
});

casper.on('http.status.404', function(resource) {
  this.echo('wait, this url is 404: ' + resource.url);
});

casper.run(function() {
  casper.exit();
});

是否有一种方法可以捕获http.status 代码,无论它是什么?现在我可以看到文档显示捕获特定代码事件的方式。如果我只想知道它是什么怎么办?

4个回答

12

看看这个(来自文档):

var casper = require("casper").create({
    }),
    utils = require('utils'),
    http = require('http'),
    fs = require('fs');

casper.start();

casper.thenOpen('http://www.yahoo.com/', function(response) {
    casper.capture('test.png');
    utils.dump(response.status);
    if (response == undefined || response.status >= 400) this.echo("failed");
});

casper.on('http.status.404', function(resource) {
  this.echo('wait, this url is 404: ' + resource.url);
});

casper.run(function() {
  casper.exit();
});

有没有办法获取“load.failed”状态呢?我知道它不在http.status中,但我试图找出如何知道何时没有网络连接。我可以使用casper.on事件,但我喜欢在thenOpen()内部处理逻辑。 - HP.
我不确定你该怎么做。你可以这样做:if (response.status >= 400)。这符合你的要求吗? - thtsigma
当没有网络连接时,在Windows中response==undefined。但是我不确定其他操作系统是否也是如此。 - HP.
做了一个小修改。我没有一台可以暂时离线的机器。不确定这是否是你想要的。如果没有其他人提供解决方案,我会在明天尝试在另一台机器上测试。 - thtsigma
很酷。它得到了答案。在thenOpen()中使用(response == undefined || response.status == null) - HP.
1
我刚刚发现如果出现404错误,response == undefined,因此response.status不存在。如何获取404?请参见此处https://dev59.com/H3XYa4cB1Zd3GeqP5FZC - HP.

4

测试模块有一个assertHttpStatus方法。来自1.1.0-DEV文档

casper.test.begin('casperjs.org is up and running', 1, function(test) {
    casper.start('http://casperjs.org/', function() {
        test.assertHttpStatus(200);
    }).run(function() {
        test.done();
    });
});

3
我认为自1.0版本以来,这变得更加容易了。
我是这样实现的:
casper.test.begin("load google!", function (test) {
    casper.start();

    casper.open("http://www.google.co.uk");

    casper.then(function () {
        var res = this.status(false);
        test.assert(res.currentHTTPStatus === 200, "homepage returns a 200 status code");
    });

    casper.run(function() {
        this.test.done();
    });
});

顺便说一下,casper.open 应该改为 casper.thenOpen - Artjom B.
@ArtjomB。是的,它可以(回答你的第一个问题)。我为什么要使用.thenOpen()? - swifty
因为从语义上讲更好,尽管它在这里似乎可以工作。open是一个非异步函数。您在顶层嵌套级别中使用它(忽略casper.test.begin)。不混合异步和阻塞调用被认为是良好的形式。 - Artjom B.

0
casper.start('http://google.fr/', function() {
    var res = this.status(false);
    this.echo(res.currentHTTPStatus);
});

casper.run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接