2016-05-30 65 views
0

只是爲了澄清,我不想等待一個條件,只需暫停n秒。這是我有的代碼,但id不能按照我的預期工作,我懷疑「wait」是異步的。我想要更改代碼,以便打印1,等待5秒鐘,打印2,然後打印3.現在打印1,打印3,然後等待5秒鐘並打印2.Casperjs - 有沒有辦法等待n秒?

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

var x = require('casper').selectXPath; 
var fs = require('fs'); 
var parsedFile = "pfile.txt"; 

casper.start(); 

function wait5seconds() { 
    casper.wait(5000, function() { 
     this.echo('2'); 
    }); 
} 

casper.then(function() { 
    this.echo('1'); 
    wait5seconds(); 
    this.echo('3'); 
}); 

casper.run(); 
+0

你會對純粹的JavaScript延遲功能感興趣嗎? –

回答

3

不,在CasperJS中沒有辦法同步等待。您使用的任何wait*應該跟着另一個步驟功能(then*wait*函數)。由於casper.echo(s)是同步的,它將立即執行。

當然,你可以定義自己的thenEcho

casper.thenEcho = function(s){ 
    this.then(function(){ 
     this.echo(s); 
    }); 
}; 

,並使用它像這樣:

casper.then(function() { 
    this.thenEcho('1'); 
    wait5seconds(); 
    this.thenEcho('3'); 
}); 
+0

感謝您的回答,我實際上正在等待幾秒鐘,甚至阻止代碼執行,提出了一個簡單的JS解決方法,我將很快發佈。 –

1

這是我最後使用的代碼執行N秒它會阻止。

function waitNseconds(n) { 
    var seconds = new Date().getTime()/1000; 
    var time_now = seconds; 
    while ((time_now + n) > seconds) 
    { 
     seconds = new Date().getTime()/1000; 
    } 
} 

,然後我把它稱爲是這樣的:

casper.then(function() { 
    this.thenEcho('1'); 
    waitNseconds(5); 
    this.thenEcho('2'); 
    this.thenEcho('3'); 
}); 

它打印1,等待5秒,打印2,然後打印3

+0

爲什麼你需要忙等待?另外,考慮到JavaScript是單線程的,我想知道你是如何實現它的。你能提供一個完整的腳本嗎? –

+0

我已經更新了關於如何調用該函數的答案。我需要這個的原因 - 我用C#編寫了一些Selenium和PhanomJS中的一個,它會導致我的測試失敗。奇怪的是,我無法檢查Selenum的響應頭,這將幫助我閱讀Set-Cookie頭,解析我需要的cookie,然後將其添加到後續調用中。我可以在CasperJS中做到這一點,但爲了儘快對代碼進行編碼並測試我的代碼,我需要一種「暫停」腳本的方法......我知道有casper.waitForSelector,但有時候我不能使用它。 –

+0

要使用while循環強制踩下暫停並模擬一種等待條件成爲真的時間,似乎是一種可靠的方法來烘烤您的CPU,並且還會在應用程序中癱瘓其他所有內容,直到循環完成。雖然沒有測試過。 –

3

你應該把casper.wait()一個casper.then()如下內:

casper.start(); 
casper.then(function(){ 
    echo('1'); 
}); 
casper.then(function(){ 
    casper.wait(5000, function(){echo('2')}); 
}); 
casper.then(function(){ 
    casper.wait(5000, function(){echo('3')}); 
}); 
相關問題