我正在努力将PhantomJS无头浏览器集成到我的项目中(目前使用的是1.6版本).在大多数情况下,它在完成我需要完成的工作方面做得很好.但是,WebPage.open()调用的方式的异步性质,以及在某些时候调用phantom.exit()的需要,使得当您无法预测它们的去向时,处理客户端重定向变得棘手去.
我所追求的只是在任何元刷新(导致不同的页面)之后调用phantom.exit()的方法,并且JavaScript重定向与诸如onload事件之类的事情相关联.我明白为什么这是一个问题,因为在理论上一个客户端重定向可以在页面加载后发生的任何秒数,我不能简单地要求的能力退出,只有当没有更多的重定向会发生.现在,我能想到的最好的解决方案是:a)手动检测页面上元刷新元素的存在并自己处理,b)使用setInterval()来节省一些时间(例如,1-在调用phantom.exit()之前经过1.5秒).基本上看起来像这样:
var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
new Date() - pageOpenedTime >= 1500)
{
phantom.exit();
}
), 1000);
page.open(url, function() {
pageOpenedTime = new Date();
if (!hasMetaRefresh(page)) {
visitComplete = true;
}
});
function hasMetaRefresh(page) {
// Query the DOM here to detect meta refresh elements
}
Run Code Online (Sandbox Code Playgroud)
有更好的想法吗?
编辑:我应该提一下,我的第一个想法是,当执行与初始页面加载相关联的JavaScript时,可能会有一个PhantomJS事件被触发,但onLoadFinished回调似乎先于任何页内JavaScript的执行,包括onload事件.我还做了一些关于我可能需要等待多少时间间隔的测试,虽然1000 ms足够长时间以便在一个小的测试页面中执行JavaScript重定向(通过body onload事件),但100 ms还不够长.
小智 8
我在加载使用Optimizely的页面时遇到了同样的问题,而且变体是location.href重定向.
我现在在"renderPage"函数中使用onNavigationRequest回调.那些优化重定向不再阻塞,我不需要任意超时.
var webpage = require('webpage');
var page = null;
var renderPage = function (myurl) {
page = webpage.create();
page.onNavigationRequested = function(url, type, willNavigate, main) {
if (main && url!=myurl && url.replace(/\/$/,"")!=myurl&& (type=="Other" || type=="Undefined") ) {
// main = navigation in main frame; type = not by click/submit etc
log("\tfollowing "+myurl+" redirect to "+url)
myurl = url;
page.close();
renderPage(url); // rerun this function wit the new URL
}
}; // on Nav req
page.open(myurl, function(status) {
if (status==="success") {
page.render("screenshot.jpg");
} else {
page.close();
}
}); // page open
} // render page
renderPage("http://some.domain.com");
Run Code Online (Sandbox Code Playgroud)
请参阅docs:http://phantomjs.org/api/webpage/handler/on-navigation-requested.html
我有一个想法,即使用模拟计时器来实现此目的。假设我们在页面中包含“一个模拟计时器” 。这样,您可以快进时间以避免 js 空闲时间。请参阅 GitHub 页面上的示例。
这只是一种让事情发生得更快的方法,但正如您所期望的,不可能确定将来是否会触发重定向事件。
| 归档时间: |
|
| 查看次数: |
6825 次 |
| 最近记录: |