自定义casperjs模块

时间:2014-05-26 13:11:58

标签: phantomjs casperjs

我已经扩展了我的casperjs以使用一些像这样的新方法:

casper.getTxt = function(selector) {
    if(this.exists(selector)) {
        return this.getHTML(selector);
    }
    else {
        return '';
    }
};

我已经在我写的每个脚本上添加了这些函数。

所以我在其他模块(custom.jscolorizer.js等)放置的同一位置创建了一个新文件mouse.js。 custom.js有以下代码:

var require = patchRequire(require);
var casper = require('casper').create();

var getTxt = function(selector) {
    if(casper.exists(selector)) {
        return casper.getHTML(selector);
    }
    else {
        return '';
    }
};

exports.getTxt = getTxt;

在我的剧本中,我是:

var cust = require('custom');
this.echo(cust.getTxt('a'));

但我收到错误:Casper is not started, can't execute exists()

我做错了什么? 重用casperjs代码的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

这是因为您还没有使用start()方法初始化您的第一个网页(我认为)。 你可能会试着回来一个'什么都不是HTML,你必须指定第一页。

见下文或how can i turn part of my casperjs script into a function so i can use it multipul times

您可以使用自定义方法制作脚本,不需要制作其他模块。 : 例如:functions.js

casper.getTxt = function(selector) {
    if(this.exists(selector)) {
        return this.getHTML(selector);
    }
    else {
        return '';
    }
};

var getTxt = function(selector) {
    if(casper.exists(selector)) {
        return casper.getHTML(selector);
    }
    else {
        return '';
    }
};

然后在主脚本中调用此脚本:

main.js

phantom.injectJs("functions.js"); //inject your script
    /**
     *  Begin a scenario
     */

casper.test.begin('\n*************** Suite of planned test : scenario 1 **************\n', 1, function suite(test) {
    /**
     * start : initialize and open the first page
     */
    casper.start('yourUrl', function() {
        //now you can call your custom methods  
        this.echo(this.getTxt('a')); //or this.echo(getTxt('a')) if normal function
        this.echo(this.getTitle());
        this.echo('Adresse : ' + this.getCurrentUrl() + '\n');
    });

    /**
     * add a new step in the stack 
     */
    casper.then(function () {
        this.test.comment('------------- step 1 ------------- : ');
        //this.echo("step 1");
        });

    /**
     * add a second step in the stack 
     */
    casper.then(function () {
        this.test.comment('------------- step 2 ------------- : ');
        //this.echo("step 2");
        var _x = require('casper').selectXPath;
        this.test.assertExists(_x('//*[@role="banner"]'),'header present');
    });


    /**
     *  run() executes them (steps): 
     */
    casper.run(function() {
        this.test.comment('---------------- Every steps done for scenario 1 ----------------\n');
        //test.done() -> when every steps executed, scenario over, feedback about tests
        test.done();
    });

如果要导出nodeLike:

custom.js

var getTxt = function(selector) {
    if(casper.exists(selector)) {
        return casper.getHTML(selector);
    }
    else {
        return '';
    }
};

exports.getTxt = getTxt;

带有要求:

var cust = require('custom');

    /**
     *  Begin
     */

casper.test.begin('\n*************** Suite of planned test : scenario 1 **************\n', 1, function suite(test) {
    /**
     * start : open the first url
     */
    casper.start('yourUrl', function() {
        this.echo(cust.getTxt('a'));
        this.echo('Adresse : ' + this.getCurrentUrl() + '\n');
    });
    casper.run(function() {
        this.test.comment('---------------- Every steps done for scenario 1 ----------------\n');
        //test.done() -> when every steps executed, scenario over, feedback about tests
        test.done();
    });

另请参阅:https://gist.github.com/n1k0/3813361