Пользовательские модули casperjs

Я расширил свои casperjs для использования некоторых новых методов, таких как этот:

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

Я должен добавить эти функции в каждый сценарий, который я пишу.

поэтому я сделал новый файл custom.js в том же месте, где другие модули (colorizer.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 ответ

Решение

Это потому, что вы не инициализировали свою первую веб-страницу с помощью метода start() (я думаю). Вы можете попытаться вернуть "а" HTML из ничего, вам нужно указать первую страницу.

Смотрите ниже или как я могу превратить часть моего скрипта casperjs в функцию, чтобы я мог использовать его несколько раз

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

Другие вопросы по тегам