我正在使用Selenium和JavaScript编写测试。我既是新手,也是函数编程和Promise的新手。我正在尝试创建一个需要做三件事的函数:


点击输入
清除输入
SendKeys输入


我当前的功能不起作用:

    var clearAndSendKeys = function(driver, elementIdentifier, sendKeys) {
        var returnValue;
        driver.findElement(elementIdentifier).then(function(inputField){
            inputField.click().then(function() {
                inputField.clear().then(function() {
                    returnValue = inputField.sendKeys(sendKeys);
                });
            });
        });
        return returnValue;
    }


然后将调用该函数,例如:

    clearAndSendKeys(driver, webdriver.By.id('date_field'), '14.09.2015').then(function(){
        //Do stuff
    });


我希望变量returnValue包含sendKeys的承诺。但是,函数clearAndSendKeys在运行sendKeys之前返回未定义的变量。我认为这是因为returnValue从未被定义为Promise,因此程序不知道它需要等待sendKeys

如何使我的函数clearAndSendKeyssendKeys返回承诺?我宁愿避免将回调添加到clearAndSendKeys函数。

编辑:从代码中删除.then({return data}),因为这是一个错字。

最佳答案

您必须从.then回调返回每个诺言:

var clearAndSendKeys = function(driver, elementIdentifier, sendKeys) {
    return driver.findElement(elementIdentifier).then(function(inputField){
        return inputField.click().then(function() {
            return inputField.clear().then(function() {
                return inputField.sendKeys(sendKeys);
            });
        });
    });
}


.then返回的promise将解析为与回调返回的值相同的值。



有关为什么您当前的代码不起作用的信息,请参见Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference。承诺是异步的。

关于javascript - 如何从“then”链中的最后一个promise返回函数中的promise,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32565577/

10-11 13:58