javascript - 在PhantomJS的evaluate()中等待DOMContentLoaded

标签 javascript phantomjs

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/

相关文章:

javascript - ngModel 不更新深层次

javascript - 将参数数组从node.js传递给CasperJS

javascript - 从 phantomjs 运行 mocha

javascript - 如何将 PhantomJS 作为服务器运行并远程调用它?

javascript - 如何将 jQuery 附加到 Selenium 的 PhantomJS 驱动程序(Python 绑定(bind))

javascript - 当输入被禁用时如何更改 Material UI TextField 的输入颜色 [MUI v : 5. 0.8]

javascript - 值(value)资本化

javascript - 为什么 ng-model 会重置所选选项?

javascript - 在字符串中添加多个连续的整数

ruby-on-rails - watir-webdriver phantomjs 和 ghostdriver