如何在返回之前等待功能完成?

How to wait for function to complete before returning?

我正在尝试创建一个我可以从任何测试中调用的函数,该函数将查看正在传递的元素(link 文本、Css 选择器、Xpath、ID),单击元素,然后验证加载后出现的 URL。我遇到的问题是它在函数完成之前返回。

我知道我需要实现异步和回调,但我很难理解结构。

clickIDverifyURL: function clickByID (elementVar, elementURL){
        var rem = this.remote;

        // if statements to look at elementVar and select the right one.. example:
        // rem.setFindByTimeout(10000)
        // .findByXpath (elementVar)
        // .click()
        // .end()

        return this.remote
            // if I code it right, I shouldn't need this sleep right?
            .sleep(30000)
            .getCurrentUrl()
            .then(function(currURL) {
                console.log(currURL);
                try {
                    assert.strictEqual(currURL, elementURL, "This test checks to see if the current URL is correct.")
                }
                catch (e)
                {
                    console.log(e)
                }
            });

    }

感谢任何帮助或评论。

你走在正确的轨道上。假设你想点击元素,等待页面转换,然后检查结果 URL,你可以这样做:

clickIDverifyURL: function (elementURL) {
    return function (element) {
        return this.parent
            .then(function () {
                return element.click();
            })

            // Wait for the page transition. This can be a sleep, or you can search for an
            // element that should be on the new page (intern will implicitly wait for it
            // to appear), or use pollUntil to wait for a more specific condition.
            .sleep(1000)

            // Get the page URL
            .getCurrentUrl()
            .then(function (url) {
                assert.strictEqual(url, elementURL);
            });
    }
}

你会像这样使用它:

.findElementByCssSelector('.someselector')
.then(myModule.clickIDverifyURL('expectedURL'))

clickIDVerifyURL 接受一些配置数据(预期的 URL)和 return 一个可以在命令的 then 回调中调用的函数。这些函数在它们的上下文中有一个 parent 属性 引用父命令链(函数链从 this.remote 开始)。

请注意,调用元素的方法,如上面的 element.click(),return 承诺,而不是命令。这意味着只能链接标准的 Promise 方法,不能链接 clickfindElementByX 等命令方法。这就是为什么上面的代码从 this.parent 而不是 [=22= 开始内部链的原因].

更新

相同的基本结构适用于其他类型的辅助方法。例如,如果您想使用辅助方法进行查找,它可能看起来像:

findBySomething: function (selector) {
    return function () {
        var setContext = arguments[arguments.length - 1];
        return this.parent
            .findByCssSelector(selector)
            .then(function (element) {
                setContext(element);
            });
    }
}

那你可以

this.remote
    .then(myModule.findBySomething('.selector'))
    .then(myModule.clickIDverifyURL('expected URL'))