CasperJS/PhantomJS .then 在 do/while 循环中不起作用
CasperJS/PhantomJS .then in do/while Loop Doesn't Work
像这样的事情对我来说似乎很合乎逻辑,但却导致了 wtfcrash 的幻影(这就是它在日志中的名称,但没有提供有用的信息)...
do {
casper.then(function() {
var targetFound = false;
links = this.evaluate(getLinks);
var searchResultsAr = [];
for (var link in links) {
searchResultsAr.push(links[link].replace('/url?q=', '').split('&sa=U')[0]);
}
for (var result in searchResultsAr) {
if (searchResultsAr[result] == target) {
targetFound = true;
casper.echo(targetFound);
break;
}
}
if(targetFound)
{
break;
}
});
}while(!targetFound);
有不同的可能性,如果你只想静态重复一些事情,你可以使用 casper.repeat() -> how to have a variable value for casper.repeat
如果你想用 multipe 做一段时间,那么在里面和一个断点,据我所知你仍然必须使用递归函数。这是一个例子:
...
casper.then(function() {
loopValidConf.call(this, 0, 15);
});
casper.then(function() {
casper.test.assert(exists, 'true after 15 tries!')
});
function loopValidConf(index, numTimes) {
if (exists === true || index >= numTimes) {
return;
}
casper.then(function() {
casper.reload(function() {
casper.echo("reset values");
});
casper.then(function() {
// set some values here
});
casper.then(function() {
casper.waitForSelector(".selector")
});
casper.then(function() {
if (casper.exists('.targetSelector')) {
exists = true;
casper.echo('targetSelector exists!');
} else {
casper.echo('targetSelector doesnt exists, try it once more!');
}
});
});
casper.then(function() {
loopValidConf.call(this, index + 1, numTimes);
});
}
...
这仍然不是最佳选择(可能会导致内存问题),但它确实有效。 :)
像这样的事情对我来说似乎很合乎逻辑,但却导致了 wtfcrash 的幻影(这就是它在日志中的名称,但没有提供有用的信息)...
do {
casper.then(function() {
var targetFound = false;
links = this.evaluate(getLinks);
var searchResultsAr = [];
for (var link in links) {
searchResultsAr.push(links[link].replace('/url?q=', '').split('&sa=U')[0]);
}
for (var result in searchResultsAr) {
if (searchResultsAr[result] == target) {
targetFound = true;
casper.echo(targetFound);
break;
}
}
if(targetFound)
{
break;
}
});
}while(!targetFound);
有不同的可能性,如果你只想静态重复一些事情,你可以使用 casper.repeat() -> how to have a variable value for casper.repeat
如果你想用 multipe 做一段时间,那么在里面和一个断点,据我所知你仍然必须使用递归函数。这是一个例子:
...
casper.then(function() {
loopValidConf.call(this, 0, 15);
});
casper.then(function() {
casper.test.assert(exists, 'true after 15 tries!')
});
function loopValidConf(index, numTimes) {
if (exists === true || index >= numTimes) {
return;
}
casper.then(function() {
casper.reload(function() {
casper.echo("reset values");
});
casper.then(function() {
// set some values here
});
casper.then(function() {
casper.waitForSelector(".selector")
});
casper.then(function() {
if (casper.exists('.targetSelector')) {
exists = true;
casper.echo('targetSelector exists!');
} else {
casper.echo('targetSelector doesnt exists, try it once more!');
}
});
});
casper.then(function() {
loopValidConf.call(this, index + 1, numTimes);
});
}
...
这仍然不是最佳选择(可能会导致内存问题),但它确实有效。 :)