Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node+PhantomJS单击按钮_Javascript_Jquery_Node.js_Phantomjs - Fatal编程技术网

Javascript 使用Node+PhantomJS单击按钮

Javascript 使用Node+PhantomJS单击按钮,javascript,jquery,node.js,phantomjs,Javascript,Jquery,Node.js,Phantomjs,我正在使用Node+PhantomJS Node做一些动态的网站爬行。打开第一页,获得链接,然后打开第二页。在第二页上,有一个按钮启动了一个搜索,我点击时遇到了问题 最初我尝试使用jQuery.click按钮元素,但当截图拍摄时,它似乎没有被点击,因为页面上的图像没有更新。我遵循了我在下面实现的方法,但是下面代码输出的屏幕截图表明按钮没有被点击 phantom.create(function (ph) { ph.createPage(function (page) { p

我正在使用Node+PhantomJS Node做一些动态的网站爬行。打开第一页,获得链接,然后打开第二页。在第二页上,有一个按钮启动了一个搜索,我点击时遇到了问题

最初我尝试使用jQuery.click按钮元素,但当截图拍摄时,它似乎没有被点击,因为页面上的图像没有更新。我遵循了我在下面实现的方法,但是下面代码输出的屏幕截图表明按钮没有被点击

phantom.create(function (ph) {
    ph.createPage(function (page) {
        page.open("www.mysamplepage.com", function (status) {
            page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {

                page.evaluate(function () {
                    return $('div.Div5 a').attr('href');
                }, function (link) {
                    page.open(link, function(status) {
                        page.evaluate(function() {

                            var element = document.getElementById('mybutton');
                            var ev = document.createEvent("MouseEvent");
                            ev.initMouseEvent(
                                "click",
                                true /* bubble */, true /* cancelable */,
                                window, null,
                                0, 0, 0, 0, /* coordinates */
                                false, false, false, false, /* modifier keys */
                                0 /*left*/, null
                            );
                            element.dispatchEvent(ev);

                        }, function() {
                            setTimeout(function() {
                                console.log('status = ' + status);
                                page.render('page.png');
                                ph.exit();
                            }, 30000);
                        });


                    });
                });
            });
        });
    });
});
我不确定它是否相关,但当我在Chrome浏览器中执行以编程方式单击按钮的代码时,它只触发一次,而随后的代码执行不会触发

var ev = document.createEvent("MouseEvent");
ev.initMouseEvent(
    "click",
    true /* bubble */, true /* cancelable */,
    window, null,
    0, 0, 0, 0, /* coordinates */
    false, false, false, false, /* modifier keys */
    0 /*left*/, null
);

document.getElementById('btnAddressSearch').dispatchEvent(ev); // Executed
document.getElementById('btnAddressSearch').dispatchEvent(ev); // Not executed
document.getElementById('btnAddressSearch').dispatchEvent(ev); // Not executed

你的代码看起来不错。请注册到OnConsolleMessage、onError、onResourceError、onResourceTimeout事件。也许有错误。您是否尝试过使用上述本机单击方法?别忘了调整phantomjs节点?谢谢Artjom。日志记录有助于定位SSL握手失败错误,但我在解决此问题时遇到困难。目前,我想知道Node+Phantom的技术堆栈是否还不够稳定,是否正在考虑切换到Node+Selenium,或者可能完全从Node切换。Node非常稳定,PhantomJS与其他浏览器一样存在许多bug和不一致性。Selenium的优点是,您可以非常轻松地更改浏览器,而直接为PhantomJS编写脚本根本不可能做到这一点。尝试将ssl协议:any和ignore ssl errors:true参数传递给phantom:您不需要创建事件来单击page.evaluate内部。只需使用document.queryselectorement.click;出于浏览器安全原因,Chrome会阻止某些事件的发送。当我试图在Chrome控制台中编写sendKeys方法时,我以一种艰难的方式了解到了这一点。然而,PhantomJS似乎没有这些相同的安全规则。无论如何,我认为点击功能不是你的问题。我相信问题在于你对page.evaluate的嵌套。将一些console.log语句或console.error放在page.evaluate范围内,以查看发生了什么。