CasperJS非常棒,但它没有向我的localhost发布我的控制台输出。
{ WEB_MEMORY: '512',
PATH: '/app/.heroku/node/bin:/usr/local/bin:/usr/bin:/bin:/app/bin:/app/node_modules/.bin',
WEB_CONCURRENCY: '1',
PWD: '/app',
NODE_ENV: 'production',
PS1: '\\[\\033[01;34m\\]\\w\\[\\033[00m\\] \\[\\033[01;32m\\]$ \\[\\033[00m\\]',
SHLVL: '1',
HOME: '/app',
NODE_HOME: '/app/.heroku/node',
PORT: '34225',
_: '/app/.heroku/node/bin/node' }
Console.log正好在我想要的时候输出,但它只发布了最后一项。我试图在各种地方添加casper.wait,但它似乎没有帮助!
答案 0 :(得分:1)
CasperJS中的所有then*
和wait*
函数均为asynchronous step functions和JavaScript has function-level scope。
这意味着for循环立即执行,并且在for循环完成后计划执行几个then()
步骤。此时,函数级变量description
,target_date
等都将具有上一个i
的值,i
将为10.这是一般JavaScript例如:JavaScript closure inside loops – simple practical example
你可以
将两个调用casper.then()
和casper.open()
更改为单个调用casper.thenOpen()
,其中循环变量直接传递给函数:
casper.thenOpen('http://localhost:1337/events', {
method: 'post',
data: {
'description': description,
'target_date': target_date,
'target_location': target_location,
},
headers: {
"stuff":"stuff"
}
});
或"关闭"通过引入IIFE来进行每次迭代的变量:
for (var i = 0 ; i < 10; i++) {
(function(){
var description = casper.fetchText(x('//*[@id="acDataId-local'+i+'"]/a')); //*[@id="acDataId-local0"]/a
console.log(description);
var target_date = casper.fetchText(x('//*[@id="dtDataId-local'+i+'"]/text()[1]'));
console.log(target_date);
var target_location = casper.fetchText(x('//*[@id="veDataId-local'+i+'"]'));
console.log(target_location);
console.log(i, description)
casper.then(function () {
casper.open('http://localhost:1337/events', {
method: 'post',
data: {
'description': description,
'target_date': target_date,
'target_location': target_location,
},
headers: {
"stuff":"stuff"
}
});
});
})();
}