2013-11-07 4 views
1
)

Я использую CasperJS для извлечения некоторого содержимого из данных HTML. Для этого я поместил некоторый код jQuery в функцию evaluate(), но код jQuery там не работает. Я не знаю, как правильно его использовать.jQuery ничего не делает внутри функции CasperJS '(

Я использую следующий код, образец:

var resultObj = []; 

var casper = require('casper').create({ 
    pageSettings: { 
     loadImages: false, 
     loadPlugins: false, 
     userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1588.0 Safari/537.36' 
    }, 
}); 

casper.start(); 

//another codes 

casper.traverseHtml = function(){ 
    var executer = casper.evaluate(function(){ 
     var htmlText = '<div><div class="tp">x</div><div class="tp">y</div><div class="tp">z</div><div class="tp">p</div></div>'; 
     object = $('<div/>').html(htmlText).contents();   
     object.find('.tp').each(function(index, element) { 
      resultObj.push({value:index}); 
     }); 
     return resultObj; 

    }); 
    resultObj = executer; 
} 
casper.then(function() { 
    casper.traverseHtml(); 
}); 

//codes 

casper.run(function() { 
    this.echo(JSON.stringify(resultObj)).exit(); 
}); 

Я получил null результат для этого кода, но когда я заменить функцию traverseHtml, как,

casper.traverseHtml = function(){ 
    var executer = casper.evaluate(function(){    
     return [{value:"1234"}]; 
    }); 
    resultObj = executer; 
} 

Тогда дает выход как,

[{"value":"1234"}] 

Я не знаю, как исправить это.

+0

У удаленной страницы есть jQuery? – hexid

ответ

1

Сначала попробуйте передать переменную JQuery в функцию оценки - возможно быстрое решение:

var executer = casper.evaluate(function($){ 

Во-вторых, проверьте, удаленная страница JQuery и проверьте версию. Если JQuery нет, инъекционные (документы найдены here):

var casper = require('casper').create({ 
    clientScripts: ["includes/jquery.min.js"] 
}); 

При использовании старой версии JQuery, возможно, потребуется заменить «$» с «JQuery» в теле функции. Попробуйте это:

var executer = casper.evaluate(function($){ 
    var htmlText = '<div><div class="tp">x</div><div class="tp">y</div><div class="tp">z</div><div class="tp">p</div></div>'; 
    object = jQuery('<div/>').html(htmlText).contents();   
    object.find('.tp').each(function(index, element) { 
     resultObj.push({value:index}); 
    }); 
    return resultObj; 
}); 

Если эти варианты не работают, откройте браузер Google Chrome и тестировать свой код JQuery в консоли на веб-странице.

1

PhantomJS имеет два контекста, и поскольку CasperJS построен поверх PhantomJS, он имеет те же два контекста. Вы получаете доступ к контексту страницы/DOM через casper.evaluate(), но он изолирован песочницей. Это означает, что вы не можете получить доступ к любой переменной, которая определена вне функции обратного вызова для casper.evaluate(). Все, что вы хотите использовать внутри, должно быть явно передано. Дополнительную информацию см. В PhantomJS documentation.

Проблема в том, что вы не определили resultObj в контексте страницы, так что вы не можете сделать push ссылкой на ссылку undefined.

var executer = casper.evaluate(function(){ 
    var resultObj = []; // only additional line 

    var htmlText = '<div><div class="tp">x</div><div class="tp">y</div><div class="tp">z</div><div class="tp">p</div></div>'; 
    var obj = $('<div/>').html(htmlText).contents();   
    obj.find('.tp').each(function(index, element) { 
     resultObj.push({value:index}); 
    }); 
    return resultObj; 
}); 

Я также изменил object локальной переменной obj.

Если страница не предоставляет JQuery, вам необходимо включить его самостоятельно:

var casper = require('casper').create({ 
    clientScripts: ["jquery.min.js"] 
}); 

При условии, вы положили jquery.min.js в директории запуска.


Если вы хотите увидеть фактическую ошибку, которая скрыта в контексте страницы, вы можете слушать "page.error" event:

casper.on("page.error", function(msg, trace) { 
    this.echo("Error: " + msg, "ERROR"); 
}); 

Есть более интересные события: Example.

Смежные вопросы