Глобальная переменная и внешние функции в 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
поддерживает этот синтаксис.