在外部(帮助程序)文件中解析承诺

时间:2017-09-11 14:17:08

标签: javascript protractor

我正在使用JavaScript测试框架,Protractor。

我有一个外部实用程序类文件,我用它来组织我的测试规范中的通用逻辑。见Using Page Objects to Organize Tests

当我使用一段代码来解析一个承诺并将其放入我的Helper实用程序类文件中时,似乎存在一个问题。

示例:

在单个spec文件中,此代码按预期工作:

test.spec.js:

it('should display the Protractor workflow text', function() {
    // match variable
    var match = false;

    // get elements by tag
    var scanElements = element.all(by.css('div')).each(function(el) {
        el.getText().then(function(text) {
            var sp = text.split(' '); // split by <space>
            for (var i = 0; i < sp.length; i++) {
                if (sp[i] == 'Protractor') {
                    match = true;
                }
            }
        });
    });

    // on complete
    scanElements.then(function() {
        console.log(match); // returns true
    });
});

但是,如果我将此逻辑分隔到我的Helper实用程序类中,则返回值为undefined

Helper.js

/** containsText [process]
 *  searchs for text in tag elements (i.e. 'string' in <a>, 'string' in <div>)

 *  @param string - tag name to limit
 *  @param string - string value to search against
 *
 *  @return boolean - if string is found
*/
this.containsText = function (tagName, stringValue) {
    // match variable
    var match = false;

    // get elements by tag
    var scanElements = element.all(by.css(tagName)).each(function(el) {
        el.getText().then(function(text) {
            var sp = text.split(' '); // split by <space>
            for (var i = 0; i < sp.length; i++) {
                if (sp[i] == stringValue) {
                    match = true;
                }
            }
        });
    });

    // on complete
    scanElements.then(function() {
        return match;
    });
}

test.spec.js

it('should display the Protractor workflow text', function() {
    console.log(helper.containsText('div', 'Protractor'));  // does not wait to resolve, returns undefined
});

编辑:Stack Overflow上类似问题的所有链接都必须通过Ajax请求处理异步调用。我正在为Protractor / Webdriver框架寻找解决方案。我已阅读有关使用Protractor创建承诺的文档,并尝试了以下内容:

Helper.js

this.containsText = function (tagName, stringValue) {
    // get elements by tag
    var scanElements = element.all(by.css(tagName)).each(function(el) {
        el.getText().then(function(text) {
            var sp = text.split(' '); // split by <space>
            for (var i = 0; i < sp.length; i++) {
                if (sp[i] == stringValue) {
                    return true;  // fufill outer promise and break execution
                }
            }
        });
    });

    return scanElements;
}

test.spec.js

helper.containsText('div', 'Protractor').then(function(f) {
    console.log(f);
});

仍在寻找一些帮助。

0 个答案:

没有答案