PhantomJS - 从click事件加载的内容不会加载到DOM

时间:2016-03-10 11:15:54

标签: javascript phantomjs

我想测试一个锚标记上的click事件会触发正确的DOM转换。我在浏览器中看到的是什么,我几乎检查了我的代码的每一行返回我想要的,除非我让PhantomJS这样做,预期的DOM转换似乎没有触发。

这是我的代码:

page.open(url, function(status) {
    if (status === "success") {                     

        var specifications = page.evaluate(function() {
            var a = document.querySelector("a[href='#Specifications']");
            var e = document.createEvent('MouseEvents');

            e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
            a.dispatchEvent(e);

            return document.querySelector("div#Specifications").innerHTML;              
        });

        console.log(specifications);
        phantom.exit()

    } else {
       phantom.exit(1);
    });
});

我最初只是调用了document.querySelector("a[href='#Specifications']").click();,结果相同。在我的Web浏览器中,单击该链接会触发DOM转换。但我无法在PhantomJS中重现它。

1 个答案:

答案 0 :(得分:1)

因此,经过多长时间弄清楚发生了什么,以下是针对遇到类似问题的人的一些建议。

首先,确保您的选择器不是问题。就我而言,我决定坚持使用文档API。与某些人关于发送点击事件的说法不同,以下工作正常:

document.querySelector("a[href='#some_section']").click();

您应该能够将jQuery与page.includeJs()一起使用。

确保在使用click()onResourceRequested之后致电onResourceReceived后,请求并接收了网页资源:

page.onResourceRequested = function(data, request) {
    console.log("phantomJS: resource requested: " + data.url);
};

page.onResourceReceived = function(response) {
    console.log("phantomJS: resource received: " + response.url);
};

最后,确保您是否正在评估在收到资源后执行单击事件后需要插入的某些值。我最终做的是:

setTimeout(function() {
    var data = page.evaluate(function() {
        return document.querySelector('div#InsertDiv').innerHTML;
    });
    console.log(data);

    phantom.exit();
}, 2000);

基本上,如果正在请求外部资源,则必须为其设置异步等待时间。