2014-10-31 61 views
1

此代碼擴展dynamic.js腳本。 dynamic.js像這樣運行:start,then,run,然後run回調是動態的loop。這運行良好。我的代碼不想在回調結束時循環,它想在中間循環,這樣我可以在之後運行更多的代碼。所以它是start,then,loop,then,run。看起來casper沒有等我的loop在退出之前完成。循環在每次運行時終止於不同的點,並且我從不會看到回顯出來。下面是一些示例輸出(它最終2周8的環之間的任何地方,通常情況下),然後將代碼:動態CasperJS循環隨機迭代終止

輸出:

start main 
start dynamic loop 
0 
Something. 
1 
Something. 
2 
Something. 
3 
Something. 
4 
Something. 
5 
Something. 

代碼:

var casper = require('casper').create(); 

var limit = 10; 
var i = 0; 

// dynamic loop 
var loop = function() { 
    if (i < limit) { 
     this.echo(i); 
     this.start("http://www.something.com", function() { 
      this.echo(this.evaluate(function() { return document.body.innerText; })); 
     }); 
     i++; 
     this.run(loop); 
    } else { 
     this.echo("dynamic loop done"); 
     this.exit(); 
    } 
} 

// main flow 
casper.start('http://www.something.com', function() { 
    this.echo("start main"); 
}); 

casper.then(function() { 
    casper.start().then(function() { 
     this.echo("start dynamic loop"); 
    }); 
    casper.run(loop); 
}); 

casper.then(function() { 
    this.echo("after dynamic loop"); 
}) 

casper.run(); 

回答

2

應使用casper.startcasper.run只在您的腳本中一次。但是,您可以使用它們。如果您將它們嵌套在另一個控制流中,則會遇到「未定義」行爲。我覺得這是最好用casper.thenOpencasper.then作爲替代casper.startcasper.run

// dynamic loop 
var loop = function() { 
    if (i < limit) { 
     this.echo(i); 
     i++; 
     this.thenOpen("http://www.something.com", function() { 
      this.echo(this.evaluate(function() { return document.body.innerText; })); 
     }); 
     this.then(loop); 
    } else { 
     this.echo("dynamic loop done"); 
    } 
} 

// main flow 
casper.start('http://www.something.com', function() { 
    this.echo("start main"); 
}); 

casper.then(loop); 

casper.then(function() { 
    this.echo("after dynamic loop"); 
}) 

casper.run(); 

你可能有多個實例casper在一個腳本,但那麼你就需要給他們以某種方式同步。

您的腳本可能需要一些修復而不進行重構。從循環中刪除this.exit();。你提前退出。但我仍強烈建議您重構您的腳本。

+0

這是有道理的。我認爲這裏學到的教訓是,如果你想根據頁面結果使Casperjs動態化,那麼你必須在'run'完成後使用回調。我的示例代碼沒有顯示,但這就是我的目標。乍一看,dynamic.js代碼看起來像嵌套'start',但它只是回調。謝謝你的幫助。 – MattDiamant 2014-10-31 15:57:46

+1

如果'casper.run'完成,則腳本終止。如果你打破了CasperJS的控制流程,那麼你必須在流動中斷的同時「等待」。這通常不是必需的。順便說一句,什麼是** dynamic.js **?這是你在網上找到的一些腳本還是你寫的東西? – 2014-10-31 16:06:03

+0

這是casper附帶的示例腳本文件夾中的腳本。 – MattDiamant 2014-11-01 19:39:44