Javascript CasperJS像for循环一样多次提交和评估

Javascript CasperJS像for循环一样多次提交和评估,javascript,webkit,phantomjs,casperjs,headless-browser,Javascript,Webkit,Phantomjs,Casperjs,Headless Browser,我正在尝试使用CasperJS自动化一些通常需要大量时间才能完成的步骤。基本上我需要登录到我们的CMS,并检查是否安装了一些插件。如果是,则只需更新它们,如果不是,则创建它们。我设法登录并进入带有插件列表的页面,但我在这里遇到了麻烦。以下是我需要做的,伪代码: for every plugin defined in my config file populate the search plugins form and submit it evaluate if the respo

我正在尝试使用CasperJS自动化一些通常需要大量时间才能完成的步骤。基本上我需要登录到我们的CMS,并检查是否安装了一些插件。如果是,则只需更新它们,如果不是,则创建它们。我设法登录并进入带有插件列表的页面,但我在这里遇到了麻烦。以下是我需要做的,伪代码:

for every plugin defined in my config file
    populate the search plugins form and submit it
    evaluate if the response contains my plugin
这是密码

casper.thenOpen(snippetsUrl, function() {
    console.log(colorizer.colorize("###############PROCESSING SNIPPETS###################", 'ERROR'));
    this.capture('snippets.png');

    this.each(Config.snippets.station, function(self, snippet) {
        self.fill('form[id="changelist-search"]', {q: snippet.name}, true);
        self.then(function() {
            this.capture(snippet.name + '.png');
        })
    });
});
发生的情况是,我的表单在一行中被提交了多次,在我的“then”步骤中,我多次捕获同一页面……如何解决此问题?

尝试以下方法:

this.each(Config.snippets.station, function(self, snippet)
{
    self.then(function()
    {
        this.fill('form[id="changelist-search"]', {q: snippet.name}, true);
    });
    self.then(function()
    {
        this.capture(snippet.name + '.png');
    })
});
初始代码不起作用的原因是Capser的
then
声明了一个延迟执行步骤。如果没有意识到,您的代码实际上执行了以下操作:

submit form 1
place capture 1 into a queue
submit form 2
place capture 2 into a queue
submit form 3
place capture 3 into a queue
// then execute the queue
capture 1
capture 2
caprure 3
生成的代码将所有步骤都放在队列中,因此它们是按正确的顺序执行的。

尝试以下操作:

this.each(Config.snippets.station, function(self, snippet)
{
    self.then(function()
    {
        this.fill('form[id="changelist-search"]', {q: snippet.name}, true);
    });
    self.then(function()
    {
        this.capture(snippet.name + '.png');
    })
});
初始代码不起作用的原因是Capser的
then
声明了一个延迟执行步骤。如果没有意识到,您的代码实际上执行了以下操作:

submit form 1
place capture 1 into a queue
submit form 2
place capture 2 into a queue
submit form 3
place capture 3 into a queue
// then execute the queue
capture 1
capture 2
caprure 3

生成的代码将所有步骤都放在队列中,因此它们以正确的顺序执行。

是,这与预期的一样有效。从你的回答中,我明白了我接下来的步骤也应该用self.then()函数包装……因此self是在页面中嵌套
then
“的关键字?@ReutSharabani,
self
不是关键字,而是给定代码段中回调函数中的第一个参数的名称。你可以把它换成你喜欢的任何东西。但是,
self
有适当的语义,可以代替
这个
。我想我明白了,谢谢。我不知道这个.doSomething()和casper.doSomething()之间有什么区别。是的,这就像预期的一样。从你的回答中,我明白了我接下来的步骤也应该用self.then()函数包装……因此self是在页面中嵌套
then
“的关键字?@ReutSharabani,
self
不是关键字,而是给定代码段中回调函数中的第一个参数的名称。你可以把它换成你喜欢的任何东西。但是,
self
有适当的语义,可以代替
这个
。我想我明白了,谢谢。我不知道这个.doSomething()和casper.doSomething()之间有什么区别