Глобальная переменная и внешние функции в SpookyJS

Я новичок в SpookyJS/CasperJS и пытаюсь выяснить ход выполнения.

Вот чего я пытаюсь добиться:

  • загрузить страницу

  • сохранить изображение страницы

  • передать это изображение в функцию и выполнить его (этот процесс довольно длинный: ~15 секунд)

  • дождитесь, пока функция вернет результат

  • используйте возвращенное значение, чтобы заполнить поле в форме на загруженной странице

  • отправить форму

это фрагмент кода, который пытается объяснить решение, которое я придумал:

var globProcessedImage;

try {
    var Spooky = require('spooky');
} catch (e) {
    var Spooky = require('../lib/spooky');
}

var spooky = new Spooky({
    child: {
        transport: 'http'
    },
    casper: {
        logLevel: 'debug',
        verbose: true
    }
}, function (err) {
    if (err) {
        e = new Error('Failed to initialize SpookyJS');
        e.details = err;
        throw e;
    }

    spooky.start('http://example.com/');

    spooky.then(function() {
        this.captureSelector('./image.png', '#img-node');
    });

    spooky.waitFor(function() {
        this.emit('image.processed');
        return globProcessedImage !== undefined;
    }, function then() {
        processedImage = globProcessedImage;
        this.sendKeys('#imagePassword', processedImage);
    });

    spooky.then(function() {
        this.capture('./page.png');
    });

    spooky.run();

    spooky.on('image.processed', function() {
        setTimeout(function() {
            globProcessedImage = 'my_result_string';
        }, 15000);
    });
});

spooky.on('error', function (e, stack) {
    console.error(e);

    if (stack) {
        console.log(stack);
    }
});

spooky.on('log', function (log) {
    if (log.space === 'remote') {
        console.log(log.message.replace(/ \- .*/, ''));
    }
});

Когда я запускаю приложение, я получаю следующую ошибку:

ReferenceError: Can't find variable: globProcessedImage

Как мне сделать globProcessedImage видно в SpookyJS? Это правильный подход к работе с внешними функциями во время веб-автоматизации?

Заранее спасибо.

1 ответ

Редактировать: на момент написания этого SpookyJS не поддерживал дополнительный синтаксис передачи объектов по значению в waitFor Обратные вызовы. Так что этот код не работает.

В отличие от casperjs, spookyjs имеет три возможных контекста: контекст spooky, контекст casper и контекст страницы.

То, что вы пытаетесь получить доступ к переменной, определенной в жутком контексте из контекста Каспера. Вы можете передавать переменные между контекстами, как описано в этом выпуске: Как сделать глобальные переменные доступными для функций внутри casper?

Таким образом, адаптируя это к вашему коду, вы должны иметь:

var globProcessedImage;

try {
    var Spooky = require('spooky');
} catch (e) {
    var Spooky = require('../lib/spooky');
}

var spooky = new Spooky({
    child: {
        transport: 'http'
    },
    casper: {
        logLevel: 'debug',
        verbose: true
    }
}, function (err) {
    if (err) {
        e = new Error('Failed to initialize SpookyJS');
        e.details = err;
        throw e;
    }

    spooky.start('http://example.com/');

    spooky.then(function() {
        this.captureSelector('./image.png', '#img-node');
        // start longRunning here
    });

    spooky.waitFor([{spookyGlobProcessedImage: globProcessedImage}, function() {
        return spookyGlobProcessedImage !== undefined;
    }], [{spookyGlobProcessedImage: globProcessedImage}, function then() {
        this.emit('image.processed', spookyGlobProcessedImage);
        processedImage = spookyGlobProcessedImage;
        this.sendKeys('#imagePassword', processedImage);
    }]);

    spooky.then(function() {
        this.capture('./page.png');
    });

    spooky.run();

    spooky.on('image.processed', function(spookyGlobProcessedImage) {
        this.echo("spookyGlobProcessedImage is " + spookyGlobProcessedImage);
    });
});

spooky.on('error', function (e, stack) {
    console.error(e);

    if (stack) {
        console.log(stack);
    }
});

spooky.on('log', function (log) {
    if (log.space === 'remote') {
        console.log(log.message.replace(/ \- .*/, ''));
    }
});

Я не знаю точно, если spooky.waitFor поддерживает этот синтаксис.

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