gpt4 book ai didi

javascript - CasperJS中的waitTimeout和stepTimeout有什么区别?

转载 作者:行者123 更新时间:2023-11-28 00:53:16 25 4
gpt4 key购买 nike

我为 casperjs 定义了以下设置

var casper = require('casper').create({
waitTimeout: 50000,
stepTimeout: 50000,
verbose: true,
viewportSize: {
width: 1400,
height: 768
},
pageSettings: {
"userAgent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36',
"loadImages": false,
"loadPlugins": false,
"webSecurityEnabled": false,
"ignoreSslErrors": true
},
onStepTimeout: function() {
this.echo("Step timed out ");
var step = casper.getStepNumber();
casper.gotoStep(step+1);
}
});

我在 casperjs 模块中添加了这些函数:

Casper.prototype.getStepNumber = function getStepNumber() {
"use strict";
return this.step;
};
Casper.prototype.gotoStep = function gotoStep(stepNum) {
"use strict";
var steps = this.steps,
last = steps.length;
this.checkStarted();
this.clear();
this.step = Math.min(stepNum,last);
return this;
};

我在数组“urlArray”中有一个 url 列表。我将一一打开所有这些网址,如下所示:

casper.start().each(urlArray, function(self, url) {
casper.thenOpen(url, function() {
this.echo("INFO:"+"\t"+url+"\t"+"Opened."+"\n");
});
});

打开 url 后,我正在资源中查找特定字符串,一旦到达那里,我只是将该特定 url 打印到 stdout 并中止当前请求,如下所示

casper.on('resource.requested', function(resource,request) {
var url = resource.url;
if(url.indexOf("some string") !== -1) {
this.echo("url: "+url);
request.abort();
}
});

问题:Casper 在到达我正在查找的资源 url 之前会转到下一页(从 urlArray),并且在某些情况下我会收到“stepTimeout”。如何限制 casper 等待我正在查找的资源 url,而不获取 stepTimeOut(假设我将有 60 秒作为 stepTimeOut)并且不跳过当前 url。

当前输出是:

INFO: url1 Opened.INFO: url2 Opened.INFO: url3 Opened.prints the resource url that I am looking for.INFO: url4 pened.INFO: url5 Opened.INFO: url6 Opened.INFO: url7 Opened.INFO: url8 Opened.prints the resource url that I am looking for.INFO: url9 Opened.INFO: url10 Opened.

注意:我正在抓取的所有url都包含我正在搜索的资源url。

最佳答案

全部wait*then*函数是 CasperJS 中的步骤。所以stepTimeout在所有这些中都使用了 waitTimeout仅用于wait*功能。

stepTimeout :

Type: Number
Default: null
Max step timeout in milliseconds; when set, every defined step function will have to execute before this timeout value has been reached. You can define the onStepTimeout() callback to catch such a case. By default, the script will die() with an error message.

上述文档告诉您需要了解的一切。要么你不设置stepTimeout或者您覆盖处理程序 casper.options.onStepTimeout到一些不die()的东西.

您遇到此问题的原因可能是因为 thenOpen步骤必然会打开页面。如果不成功,则一段时间后会达到超时,因此脚本会终止。

其他注意事项:

您说您想要等到请求特定资源,但您不想实际加载它。看来你不是在谈论页面,而是页面中的一些资源(js、css、img、ajax 调用等)。您应该将事件处理程序从 page.resource.requested 更改为至resource.requested .
当你这样做的时候,改变 url.indexOf("some string")url.indexOf("some string") !== -1否则无法匹配url的协议(protocol)。

如果该资源确实存在于您加载的每个页面上,那么您可以

casper.start().each(urlArray, function(self, url) {
casper.thenOpen(url, function() {
this.echo("INFO:"+"\t"+url+"\t"+"Opened."+"\n");
}).waitForResource(function test(resource){
return resource.url.indexOf("some string") !== -1;
}, function then(){
this.echo("INFO: resource loaded");
});
});

但是你不能 abort事件处理程序中的请求,因为那样它可能不起作用。

关于javascript - CasperJS中的waitTimeout和stepTimeout有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26522737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com