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

时间:2015-09-01 19:08:55

标签: intern leadfoot

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

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

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

    }

感谢任何帮助或评论。

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。假设您要单击该元素,等待页面转换,然后检查生成的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)并返回一个可以在Command then回调中调用的函数。这些函数在其上下文中具有parent属性,该属性引用父命令链(从this.remote开始的函数链)。

请注意,调用Elements的方法(如上面的element.click())会返回Promises,而不是Commands。这意味着只能链接标准的Promise方法,而不是clickfindElementByX等命令方法。这就是为什么上面的代码从this.parent开始内链而不是element

<强>更新

相同的基本结构适用于其他类型的辅助方法。例如,如果您想使用辅助方法进行查找,则可能如下所示:

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'))