2013-06-19 31 views
0

我正在編寫Selenium soda測試。 當我使用方法別名來避免ARGS copyPasting ...TypeError:對象在硒中沒有方法「命令」

var method = bool ? browser.clickAndWait : browser.click; 
method("css=button:first", function (err) { 
    if (err) { 
     console.log(err); 
    } 
}); 

...我得到一個TypeError

/pathToMyProject/node_modules/soda/lib/soda/client.js:478 
     return this.command(cmd, args, fn); 
      ^
TypeError: Object #<Object> has no method 'command' 

全碼:

var soda = require('soda'), 
    assert = require('assert'); 


var browser = soda.createClient({ 
    host: 'localhost', port: 4444, url: 'http://google.com', browser: 'firefox' 
}); 

browser.session(function (err) { 
    browser.open('/', function (err, body, res) { 
     if (!err) { 
      bool = false; 
      var method = bool ? browser.clickAndWait : browser.click; 
      method("css=button:first", function (err) { 
       if (err) { 
        console.log(err); 
       } 
      }); 
     } 
    }); 
}); 

如果我只用clickAndWaitclick,一切正常,但是,我想根據bool的值選擇哪種方法。

兩個函數的參數都是一樣的,那麼爲什麼這不起作用呢?當我使用簡單的功能,而無需soda,像下面,東西很好地工作:

var a = function(){}; 
var b = function(){}; 
var c = bool ? a : c; 
c(); 

我得到使用apply了同樣的錯誤:

var args = ["css=button:first", function (err) { 
    if (err) { 
     console.log(err); 
    } 
}]; 
browser.click.apply(undefined, args); 

回答

1

是你的榜樣的工作原理是,有之間沒有相關性的原因abc;它們都是簡單的功能。僅僅引用一個對象的方法並不總是可能的。在你的情況下,soda可能會從你創建的method引用中調用command,但範圍是錯誤的。

如果函數與(但不做出參考功能時)的作品,爲什麼不只是做這樣的事情:

//... 
var myFunction = function (err) { 
    if (err) { 
     console.log(err); 
    } 
} 

if (bool) { 
    browser.clickAndWait("css=button:first", myFunction); 
} else { 
    browser.click("css=button:first", myFunction); 
} 
// ... 

或更短的變化:

// ... 
(bool ? browser.clickAndWait : browser.click)("css=button:first", myFunction); 
// ... 

或者,您可能只需在設定範圍時調用適用範圍:

// ... 
var method = bool ? browser.clickAndWait : browser.click; 
method.apply(browser, ["css=button:first", function (err) { 
    if (err) { 
     console.log(err); 
    } 
}]); 
// ... 
相關問題