Веб-автоматизация, события и поток выполнения в CasperJS

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

Это то, чего я пытаюсь достичь:

  1. загрузить страницу

  2. хранит изображение страницы

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

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

  5. использовать возвращенное значение для заполнения поля в форме на загруженной странице

  6. отправить форму

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

var globProcessedImage;

var casper = require('casper').create({
    viewportSize: {
        width: 1024,
        height: 768
    }
});

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

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

casper.waitFor(function() {
    return globProcessedImage !== undefined;
}, function then() {
    this.sendKeys('#imagePassword', globProcessedImage);
});

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

casper.run();

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

Это приводит к ReferenceError: Can't find variable: globProcessedImage.

Мне до сих пор неясно, как веб-автоматизация и «внешние» функции смешиваются вместе с CasperJS, а также как параметры передаются между страницей и средами casper/phantom.


person lerio    schedule 14.05.2014    source источник
comment
emit работает не так. emit запускает обратный вызов Вы должны выполнять longProcess синхронно. Вы пробовали это полусинхронно, используя casper.wait(20000)?   -  person Artjom B.    schedule 14.05.2014
comment
То, чего я хочу добиться, на самом деле довольно просто: 1) Начать веб-автоматизацию 2) Приостановить автоматизацию и вызвать внешнюю функцию, передав параметр 3) Получить результат из функции 4) Возобновить заполнение формы с использованием результата. Где я должен поставить casper.wait? Что делать, если внешний процесс занимает более 20000 мс?   -  person lerio    schedule 15.05.2014


Ответы (1)


Может быть, что-то вроде этого:

var globProcessedImage ;

var casper = require('casper').create({
    viewportSize: {
        width: 1024,
        height: 768
    }
});

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

casper.options.waitTimeout = 16000;

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

/*
 * If you need to wait for a fix time, it's okay, but a better way would be to wait in Casper 
 * 'the thing you do with your image' in a waitFor. -> asynchronous. With this solution you combine two timers, this is not the optimized solution.
 */
casper.waitFor(function() {
    return globProcessedImage !== undefined;
}, function then() {
    this.sendKeys('#imagePassword', globProcessedImage);
});

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

casper.run();

casper.on('image.processed', function() {
    setTimeout(function() {
        //when you will emit this event in your script, it will set the value of globProcessedImage to 'my_result' after 15sec
        globProcessedImage = 'my_result';
    }, 15000);
});
person Fanch    schedule 14.05.2014
comment
По-видимому, this.emit('image.processed') всегда будет возвращать undefined, даже если я заставлю processedValue = 'some_value'; перед оператором return. Это правильный способ вернуть значение emit? - person lerio; 14.05.2014
comment
Как назначить глобальную переменную в моем пользовательском событии? Я пробовал с window.processedValue = processedValue, но выдает ошибку: ReferenceError: window is not defined - person lerio; 15.05.2014
comment
Я отредактировал исходный вопрос с новым фрагментом. При попытке доступа к globProcessValue выдается ReferenceError. Первоначальная цель image.processed — вернуть строковое значение после обработки PNG, что занимает до 15-20 секунд. - person lerio; 15.05.2014
comment
Мои предыдущие комментарии были неправильными, обновите пост: p - person Fanch; 15.05.2014
comment
Привет, @Fanch, как с тобой связаться за пределами stackoverflow? У меня есть небольшой сценарий, с которым я хотел бы получить ваш совет. заранее спасибо - person Ace Green; 24.09.2015
comment
Fanch- на гитхабе, так что вы можете пообщаться со мной на гиттере :) - person Fanch; 24.09.2015