[英]How to check broken links in a webpage using Casperjs?
我想使用casperjs检查网页中所有损坏的链接。 我写下面的代码,但它不起作用:
casper.then(function() {
var urls=casper.getElementsAttribute('a[href]', 'href');
casper.eachThen(urls, function(response) {
var link=response.data;
this.thenOpen(demourl, function(response) {
if (response == undefined || response.status >= 400) {
this.echo("failed");
}
})
this.on('http.status.404', function(resource) {
this.echo('wait, this url is 404: ' + resource.url);
})
})
})
我的网页包含400多个链接。 我的代码未完成其执行,并在某些链接后保持空闲状态。 它没有给我任何回应。 我不明白为什么会这样吗?
DOM元素的属性和属性之间存在差异。 如果您的网站位于域名http://example.com上,并且希望获得该页面上以下链接的href
<a href="/path/to/stuff">text</a>
如果使用aElement.getAttribute("href")
,则将获得"/path/to/stuff"
;但是,如果使用aElement.href
,则将获得计算的URL "http://example.com/path/to/stuff"
。 只有后者是CasperJS(实际上是PhantomJS)可以理解的URL。
我要告诉您的是,因为casper.getElementsAttribute()
内部使用element.getAttribute()
方法,该方法生成的URL无法使用casper.thenOpen()
打开。
解决方法很简单:
var urls = casper.evaluate(function(){
return [].map.call(document.querySelectorAll('a[href]'), function(a){
return a.href;
});
});
另外,您可能希望将casper.on()
事件注册casper.eachThen()
调用上方。 您无需在每次迭代中都注册事件。
由于某些URL无法加载(可能是因为它们已损坏),因此存在问题,因此可以使用casper.options.stepTimeout
设置步骤超时,这样CasperJS不会冻结在某些无法检索的URL上。 您还需要定义onStepTimeout()
回调,否则CasperJS将退出。
casper.then(function() {
var currentURL;
casper.options.stepTimeout = 10000; // 10 seconds
casper.options.onStepTimeout = function(timeout, stepNum){
this.echo('wait, this url timed out: ' + currentURL);
};
var urls = this.evaluate(function(){
return [].map.call(document.querySelectorAll('a[href]'), function(a){
return a.href;
});
});
this.on('http.status.404', function(resource) {
this.echo('wait, this url is 404: ' + resource.url);
});
urls.forEach(function(link) {
this.then(function(){
currentURL = link;
});
this.thenOpen(link, function(response) {
if (response == undefined || response.status >= 400) {
this.echo("failed: " + link);
}
});
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.