无法使用PhantomJS获取要单击的链接并切换到下一页

Cannot get link to be clicked and switch to next page using PhantomJS

本文关键字:链接 一页 单击 PhantomJS 获取      更新时间:2023-09-26

我在让phantomJS点击网站上的登录按钮时遇到问题。

在我的第二张截图中,我可以看到它正在尝试选择登录按钮,但我无法让它等待并在下一页截图。

这是我的JS文件:

var page = require('webpage').create();
page.viewportSize = {width: 1920,height: 1080};
page.open('http://clubs.bluesombrero.com/default.aspx?portalid=1809', function (status) {
    console.log("Status: " + status);
    if (status === "success") {
        var url = page.url;
        console.log('URL: ' + url);
        console.log("TC0001: Pass");
        page.render('TC0001.png');
        var a = page.evaluate(function() {
        return document.querySelector('#dnn_dnnLOGIN_cmdLogin');
        });
        page.sendEvent('click', a.offsetLeft, a.offsetTop);
        page.render('TC0002.png');
    } else {
        console.log("TC0001: Failed, Page did not load.");
    }
    phantom.exit();
});

我试过几种方法让它在页面加载后等待截图,但我没有任何运气。

page.sendEvent()是一个同步函数,它的操作一完成就结束。下一个调用(page.render())甚至在响应由点击触发的请求之前就被执行。

1.setTimeout

JavaScript提供了两个函数来等待静态时间:setTimeoutsetInterval:

page.sendEvent('click', a.offsetLeft, a.offsetTop);
setTimeout(function(){
    page.render('TC0002.png');
    phantom.exit();
}, 5000);

(别忘了移除另一个phantom.exit(),因为你不想过早退出)

当然,现在的问题是,一方面页面可能在5秒钟后仍未准备好,另一方面页面加载速度极快,只是坐在那里无所事事。

2.waitFor

更好的方法是使用PhantomJS的examples文件夹中提供的waitFor()函数。您可以等待页面的特定条件,如特定元素的存在:

page.sendEvent('click', a.offsetLeft, a.offsetTop);
waitFor(function _testFx(){
    return page.evaluate(function(){
        return !!document.querySelector("#someID");
    });
}, function _done(){
    page.render('TC0002.png');
    phantom.exit();
}, 10000);

3.page.onLoadFinished

另一种方法是监听page.onLoadFinished事件,该事件将在加载下一个页面时调用,但您应该在单击之前注册:

page.onLoadFinished = function(){
    page.render('TC0002.png');
    phantom.exit();
};
page.sendEvent('click', a.offsetLeft, a.offsetTop);

4.page.onPageCreated

每当在桌面浏览器中打开新窗口/选项卡时,PhantomJS中就会触发page.onPageCreated。它提供了对新创建的页面的引用,因为上一个页面不会被覆盖。

page.onPageCreated = function(newPage){
    newPage.render('TC0002.png');
    newPage.close();
    phantom.exit();
};
page.sendEvent('click', a.offsetLeft, a.offsetTop);

在所有其他情况下,page实例都会被新页面覆盖。

5."完整"页面加载

这可能仍然不够,因为PhantomJS没有指定加载页面时的含义,页面的JavaScript可能仍然会发出进一步的请求来构建页面。这个问答;A有一些等待"完整"页面加载的好建议:phantomjs不等待"完整的"页面加载