首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhantomJS的DOMContentLoaded ()

PhantomJS的DOMContentLoaded ()
EN

Stack Overflow用户
提问于 2015-07-16 22:20:59
回答 1查看 923关注 0票数 1

不执行page.evaluate()中的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);
    }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-17 20:53:53

PhantomJS的page.open()是一个异步函数。它的回调最早是在页面请求的响应被完全传输和解析时调用的。它没有明确定义回调是什么时候调用的,但根据经验,每次加载所有即时资源(而不是异步资源)时,都会调用回调。

这意味着在页面上触发DOMContentLoaded事件之后很长时间就会调用回调。这反过来意味着,如果您在DOMContentLoaded被触发后注册它,那么您的事件处理程序将永远不会触发。

现在看起来是这样的:

代码语言:javascript
复制
page.evaluate(function(){
    var links = document.querySelectorAll('a.link');
    Array.prototype.forEach.call(links, function(e){ 
        e.click();
    });
});

问题是,element.click()在大多数页面上不起作用。PhantomJS; click an element问题有多种解决方案来解决这一困境。你这样做:

代码语言:javascript
复制
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);
    });
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31465531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档