Nodejs очищает веб-сайт после того, как javascript загрузил значения

Возможно, вопрос новичка по nodejs/jsdom

Я пытаюсь очистить веб-сайт с помощью node.js. Я использую jsdom и jquery для получения html и анализа необходимых вещей. Но почему-то значения, которые я получаю, не соответствуют тем, которые показаны на веб-сайте. В основном значения динамически изменяются с помощью javascript, и мне нужны эти значения. Вся причина, по которой я использовал nodejs/jsdom для очистки, заключалась в том, что js будет выполняться, и я получаю значения после этого события.

Есть ли способ заставить jsdom дождаться выполнения javascript? или я все неправильно понял? Я много гуглил по этому вопросу.


person zubinmehta    schedule 21.02.2012    source источник


Ответы (2)


Вам лучше использовать что-то вроде casperjs http://casperjs.org/. Это утилита для тестирования, основанная на phantomjs. Это в основном то же самое, что и открытие страницы в браузере webkit, только без графического интерфейса. Вы могли бы написать что-то вроде. Я не думаю, что это работает с узлом, но должно быть достаточно просто запустить скрипт casper и передать вывод обратно в узел.:

var casper = require('casper').create({
    loadImages: true,
    loadPlugins: true,
    verbose: true,
    //logLevel: 'info',
    clientScripts: [
        'jquery-1.7.1.min.js',
    ],
    viewportSize: {
        width: 1366,
        height: 768,
    },
    pageSettings: {
        javascriptEnabled: true,
        userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5',
    },
});

casper.start(url);

casper.thenEvaluate(function () {
    //javascript code to run in the scope of the page
});
person tapan    schedule 04.05.2012

Во-первых, как вы используете jsdom? Судя по всему, jsdom.env не выполняет скрипты в DOM, а только те скрипты, которые вы добавляете при вызове jsdom.env. Если вы хотите выполнять сценарии, я думаю, вам следует использовать jsdom.jsdom.

Во-вторых, вам нужно указать обработчик onload. Это должно выполняться после того, как документ будет готов, и, надеюсь, любые сценарии изменят DOM по вашему вкусу.

Что-то вроде этого:

var jsdom = require('jsdom').jsdom
  , document = jsdom(html)
  , window = document.createWindow();

document.onload = function() {
  // Do your stuff
}
person Linus Thiel    schedule 21.02.2012