2016-05-30 66 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')}); 
}); 
相关问题