Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从“函数”链中的最后一个承诺返回函数中的承诺;然后";_Javascript_Selenium_Return_Promise - Fatal编程技术网

Javascript 如何从“函数”链中的最后一个承诺返回函数中的承诺;然后";

Javascript 如何从“函数”链中的最后一个承诺返回函数中的承诺;然后";,javascript,selenium,return,promise,Javascript,Selenium,Return,Promise,我正在使用Selenium和JavaScript编写一个测试。我对两者都是新手,对函数编程和承诺也是新手。我正在尝试创建一个函数,它需要做3件事: 点击输入 清除输入 发送输入键 我当前的功能不起作用: var clearAndSendKeys = function(driver, elementIdentifier, sendKeys) { var returnValue; driver.findElement(elementIdentifier).th

我正在使用Selenium和JavaScript编写一个测试。我对两者都是新手,对函数编程和承诺也是新手。我正在尝试创建一个函数,它需要做3件事:

  • 点击输入
  • 清除输入
  • 发送输入键
  • 我当前的功能不起作用:

        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
    从未定义为承诺,因此程序不知道它需要等待
    sendKeys

    如何使我的函数
    clearAndSendKeys
    sendKeys
    返回承诺?我宁愿避免向
    clearAndSendKeys
    函数添加回调

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

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

    您必须从
    中返回每个承诺。然后
    回调:

    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);
                });                 
            });                 
        });
    }
    
    返回的承诺将解析为与回调返回的值相同的值



    有关当前代码无法工作的原因,请参阅。承诺是异步的

    首先,嵌套承诺可能不是最好的主意,完全违背了它们消除回调地狱的主要目的
    然后
    回调可以返回
    对象,该对象允许创建漂亮的异步操作链

    在这种情况下,您只需要将对输入字段的引用作为第一个异步操作的结果存储在主函数的作用域中,然后创建可以从此函数返回的异步操作链

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

    您需要为承诺分配returnValue,第一行应该是
    var returnValue=driver.findelelement(…
    ,-使用callbacksHi Arun,为什么他在尝试使用承诺时要使用回调?这些函数中有/全部是(
    .findelelement()
    。click()
    .clear()
    .sendKeys()
    )即使是异步的?我猜
    sendKeys
    至少会返回一个承诺,其他的呢?全局
    inputFieldRef
    变量是一种特别丑陋的方式。比下面的死亡金字塔更好!!@Bergi-我对如何克服这种丑陋感兴趣,但实际上看不到链接中有什么东西是怎样的你已经发帖了elegant@JaromandaX:ES7 async/await绝对更优雅:-)不管怎样,我不认为第二层嵌套(更多是不必要的)有那么糟糕,它很可能是
    driver.findElement(…)。然后(函数(inputField){return inputField.click()。然后(inputField.clear.bind(inputField))。然后(inputField.sendKeys.bind(inputField,sendKeys));})
    @Bergi-谢谢。我同意,这是金字塔和外部范围变量(不一定是全局变量)之间的一个很好的折衷方案