Я пытаюсь очень простой пример с Phantom + JQuery: я хочу отобразить ярлык Top Questions на странице stackoverflow.com в консоли. Вот мой скрипт testphantom.js:
var page = require('webpage').create();
page.open('http://stackoverflow.com/', function() {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js", function() {
page.evaluate(function() {
var txt = $('#h-top-questions').text();
console.log('TEXT: ' + txt);
});
phantom.exit();
});
});
Но он ничего не отображает:
>phantomjs testphantom.js
>
Что здесь не так?
Вы регистрируете текст в контексте браузера, но на самом деле вы хотите вызвать console.log
в контексте phantomjs:
var page = require('webpage').create();
page.open('http://stackoverflow.com/', function() {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js", function() {
// Get the text value
var txt = page.evaluate(function() {
// Browser context
return jQuery('#h-top-questions').text();
});
// Log the text - phantomJS context
console.log('TEXT: ' + txt);
phantom.exit();
});
});
Ваш код не работает, потому что вы пытаетесь зарегистрировать сообщение с веб-страницы на фантомном объекте, в то время как веб-страница не имеет доступа к фантомному объекту, давайте возьмем пример: вы являетесь разработчиком браузера, а в вашем браузере запущены некоторые веб-страницы представьте, что произойдет, если пользователь, работающий на веб-странице, получит доступ к объекту вашего браузера. Теперь он может контролировать все. Итак, почему выполнение веб-страницы и фантомного объекта изолировано. Примечание: phantomjs - это безгласный браузер.
См. Это: http://phantomjs.org/api/webpage/method/evaluate.html