page.evaluate()
中的 JavaScript 代码未执行。也许您需要在执行前设置延迟?
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);
}
});
最佳答案
PhantomJS 的 page.open()
是一个异步函数。当页面请求的响应被完全传输和解析时,它的回调最早被调用。没有明确定义何时调用回调,但根据经验,我会说一旦加载了所有直接资源(不是异步资源),它总是会被调用。
这意味着在页面上触发 DOMContentLoaded 事件很久之后才会调用回调。这反过来意味着,如果您在 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);
});
});
关于javascript - 在PhantomJS的evaluate()中等待DOMContentLoaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465531/