0

我正在写硒苏打水测试。当我使用方法别名来避免 args 复制粘贴时...

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);
                }
            });
        }
    });
});

如果我只使用clickAndWaitor click,一切正常,但是,我想根据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);
4

1 回答 1

1

a您的示例有效的原因是,bc;之间没有依赖关系。它们都是简单的功能。并不总是可以只引用对象的方法。在您的情况下,可能会从您创建的引用中soda调用,但范围是错误的。commandmethod

如果该函数适用于任何一个(但不是在引用该函数时),为什么不做这样的事情:

//...
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);
// ...

或者,您可能只需要在调用 apply 时设置范围:

// ...
var method = bool ? browser.clickAndWait : browser.click;
method.apply(browser, ["css=button:first", function (err) {
    if (err) {
        console.log(err);
    }
}]);
// ...
于 2013-06-21T22:03:01.030 回答