如何在JavaScript / CoffeeScript中优雅地循环链接调用?

时间:2011-09-26 14:59:51

标签: javascript coffeescript dry

我正在使用Soda在Node.js中编写Selenium测试,我有一种情况,我必须多次按下向下键。

目前代码如下:

browser                                                                     
  .chain                                                                    
  .setSpeed(200)                                                            
  .session()                                                                
  .open('/')                                                                
  .click("id=save")                                                         
  .focus(editor)                                                            
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  
  .keyDown(editor, '\\40')                                                  

  ...                                                                       

我怎么能干这个?

只使用这样的循环不适用于此lib:

var b = browser.chain()                                                     
for (var i = 0; i < 10; i++) {                                              
  b.keyDown(editor, '\\40')                                                 
}                                                                           

很棒的想法?

我可以在Soda中使用异步API,例如async-lib来帮助我,但这不是我在这里要求的。它使其他一些事情变得丑陋。

3 个答案:

答案 0 :(得分:4)

有一个名为and的方法用于在命令链中间执行复杂的操作:

browser
  .chain
  .setSpeed(200)
  .session()
  .open('/')
  .click("id=save")
  .focus(editor)
  .and(function (browser) {
    for (var i = 0; i < 10; i++) {
      browser.keyDown(editor, '\\40')
    }
  })
  ...

有关详细信息,请参阅自述文件:https://github.com/learnboost/soda

答案 1 :(得分:3)

您是否尝试更换循环中的b变量?

var b = browser.chain()                                                     
for (var i = 0; i < 10; i++) {                                              
  b = b.keyDown(editor, '\\40')                                                 
}                                                                           

答案 2 :(得分:2)

你很亲密。你只需要在循环中更改b,以便正确链接。

var b = browser.chain()                                                      
for (var i = 0; i < 10; i++) {                                               
  b = b.keyDown(editor, '\\40')                                                  
}