无法使用PhantomJS获取要单击的链接并切换到下一页
Cannot get link to be clicked and switch to next page using PhantomJS
我在让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提供了两个函数来等待静态时间:setTimeout
和setInterval
:
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不等待"完整的"页面加载
相关文章:
- 一页接一页丢失
- Javascript一页滚动脚本滚动到每个点击的链接一个接一个
- 从页面上点击的链接中删除数据,然后移动到下一页&在CasperJS中重复
- 为链接打开一个新窗口,但希望下一页仍在“主体”框架中
- 如何使用 ajax 一次抓取一页,返回下一页链接并再次访问
- 一张图片的多个标题-点击链接一次查看一个
- 有没有可能制作一个链接到一页的网页,打开并定位在特定的文章中
- 你能从上一页的链接执行某些加载功能吗
- 当传递单选按钮值时,PHP重定向到另一页上的锚链接
- 无法使用PhantomJS获取要单击的链接并切换到下一页
- 使用超链接将值传递到(另一页上的)文本框中
- jquery链接在加载下一页之前单击切换图像
- Angularjs-检索给定链接的页面的html
- 在angularjs中,点击一个链接后给下一页传递一个ID
- 如何使一个链接记住它的价值作为一个href之前转移到下一页中使用
- 在点击一个特定的链接一次
- 通过PHP (WP插件)发送一个数组到前端JS变量,然后替换页面上的href链接(如果存在)
- 一页接一页
- 如何在jquery中链接分页和pagesscroll
- jQuery只在更改时触发链接一次