PhantomJS Передача переменной в page.evaluate по ссылке

Я искал в течение 2 дней, но все еще без изменений, мне нужно иметь foo переменная по ссылке внутри page.evaluate но кажется невозможным.

var foo = 42;

setInterval(function(){
      console.log('outer '+foo++);

},1000);

page.open(url, function() {

  var pe = page.evaluate(function(foo) {
     setInterval(function(){
          console.log('inner inner '+foo);
      },1000);
  },foo);
  setInterval(function(){
      console.log('inner '+foo);
  },1000);
}.bind(foo));

и внешнее и внутреннее обновляются, но inner inner foo является статическим. Я также пытался связать, но он возвращает эту ошибку:

SyntaxError: Expected token ']'

  undefined:2 in evaluateJavaScript
  phantomjs://platform/webpage.js:390 in evaluate
  phantomjs://code/foo.js:37
  :0
  phantomjs://platform/webpage.js:286 in _onPageOpenFinished

Изменить: Только что выяснил, что функция оценки является песочницей, мне просто любопытно, есть ли какой-то способ передачи сообщений или IPC между этими двумя?

1 ответ

Решение

есть ли какой-то способ передачи сообщений или IPC между этими двумя?

Действительно есть - page.evaluate может вернуть простую переменную или сериализованный объект во внешний контекст:

var value_from_sandbox = page.evaluate(function(){ return 42; });

Вы не указываете это явно в своем вопросе, но из примеров кода, которые я беру, вы хотите отслеживать некоторую переменную на активной странице. Это возможно:

page.open(url, function() {

    // Set interval function in PhantomJS scope 
    // that will extract a variable from the page once a second
    setInterval(function(){

        var foo = page.evaluate(function() {
            return document.getElementById('foo').innerHTML;
        }

        console.log(foo);

    }, 1000);

});

Есть еще один способ позвонить "домой" из песочницы: page.callPhantom, но учтите, что в документах он все еще был помечен как "экспериментальный".

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