2015-07-16 2 views
1

Код JavaScript в page.evaluate() не выполнен. Может быть, вам нужно установить задержку перед выполнением?Ожидание DOMContentLoaded в оценке PhantomJS()

var page = require("webpage").create(), 
    system = require("system"), 
    urls = "http://www.domaines.com", 
    useragents = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36", 
    w = 600, 
    h = 800, 
    cookie = phantom.addCookie({ 
     'name'  : 'uhash', 
     'value' : '8bb0c9ebcb5781g55196a1ff08c41b4d', 
     'domain' : '.domaines.com', 
     'path'  : '/',     
     'httponly' : false, 
     'secure' : false 
    }); 
page.viewportSize = { width: w, height: h }; 
page.settings.userAgent = useragents; 
page.open(urls, function(status){ 
    if(status !=='success'){ 
     phantom.exit(); 
    }else{ 
     page.cookie; 
     page.evaluate(function(){ 
      function load(){ 
       var links = document.querySelectorAll('a.link'); 
       Array.prototype.forEach.call(links, function(e){ 
        e.click(); 
       }); 
      } 
      document.addEventListener('DOMContentLoaded', load); 
     }); 

     window.setTimeout(function() { 
      page.render('s.png'); 
      phantom.exit(); 
     }, 200); 
    } 
}); 

ответ

0

PhantomJS-х page.open() асинхронная функция. Его обратный вызов вызывается как можно раньше, когда ответ на запрос страницы полностью передается и анализируется. Это четко не определено, когда вызывается обратный вызов, но из опыта, который я бы сказал, он всегда называется, как только будут загружены все непосредственные ресурсы (а не ресурсы async).

Это означает, что обратный вызов вызывается долго после запуска события DOMContentLoaded на странице. Это, в свою очередь, означает, что если вы зарегистрируетесь в DOMContentLoaded после его запуска, ваш обработчик событий никогда не будет срабатывать.

Теперь это выглядит следующим образом:

page.evaluate(function(){ 
    var links = document.querySelectorAll('a.link'); 
    Array.prototype.forEach.call(links, function(e){ 
     e.click(); 
    }); 
}); 

Проблема заключается в том, что element.click() не работает на большинстве страниц. Вопрос PhantomJS; click an element имеет множество решений для этого затруднительного положения. Вы делаете это так:

page.evaluate(function(){ 
    var links = document.querySelectorAll('a.link'); 
    Array.prototype.forEach.call(links, function(e){ 
     var ev = document.createEvent('MouseEvents'); 
     ev.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, 
       false, false, false, false, 0, null); 
     e.dispatchEvent(ev); 
    }); 
}); 
Смежные вопросы