2016-06-01 4 views
1

Я пытаюсь извлечь определенный элемент веб-страницы и сохранить его как изображение локально.phantom-node не передает возвращаемое значение из функции page.evaluate

Node.js код, используя фантомного-узел:

var phantom = require('phantom'); 

phantom.create().then(function(ph) { 

    ph.createPage().then(function(page) { 

    page.property('viewportSize', {width: 1600, height: 900}); 
    page.open('http://stackoverflow.com/questions/37570827/saving-element-of-webpage-as-an-image-using-js').then(function(status) { 

     if (status == 'success') { 
      page.evaluate(function() { 
       return document.getElementById("sidebar").getBoundingClientRect(); 

      }).then(function(rect){ 
       console.log(rect); 
       page.property('clipRect', rect); 
       page.render("question2.png"); 
      }); 
     } 
     page.close(); 
     ph.exit(); 
    }); 
    }); 
}); 

console.log (Rect) печатает различные значения каждый раз, когда я запустить его. Я не понимаю, почему это так, но в любом случае, я полагаю, что мой оператор возврата боковой ограничитель прямоугольника не работает. Что-то не так с кодом?

Edit: на самом деле, после дальнейшей отладки, кажется, что прямоугольник возвращается правильно, но не установлен clipRect ..

+0

Да, это имеет смысл, что различные значения печатаются каждый раз, потому что содержание постоянно меняется. –

+0

Проблема в том, что она всегда отображает полную страницу, а не элемент боковой панели. Я хочу определенную часть страницы. –

+0

Вы пытались вызвать 'render' в отдельном обратном вызове' then'? –

ответ

0

Проблема заключалась в том, что вызов page.render не было достаточно времени, чтобы закончить до появления страницы. close().

Этот код решает эту проблему:

var phantom = require('phantom'); 

phantom.create().then(function(ph) { 

    ph.createPage().then(function(page) { 

     page.open('http://stackoverflow.com/questions/37570827/saving-element-of-webpage-as-an-image-using-js').then(function(status) { 

      if (status == 'success') { 
       page.evaluate(function() { 
        return document.getElementById("sidebar").getBoundingClientRect(); 
       }).then(function(rect){ 
        page.property('clipRect', rect); 
        page.render("question.png").then(function(){ 
         page.close(); 
         ph.exit(); 
        }); 
       }); 
      } 
     }); 
    }); 
});