有protractor.promise.when()方法吗?

时间:2016-11-15 17:17:32

标签: selenium-webdriver protractor

我看到我可以使用protractor.promise.all()。有protractor.promise.when()吗?我在哪里可以找到更多关于它以及如何使用它?

我的问题是我需要解决所有getText()承诺,确定哪些失败并为失败者提供空白。

例如:

function getValues() {
    let pFirstName = $('#firstname').getText();
    let pLastName = $('#lastname').getText();
    let pSSN = $('#ssn').getText();
    return protractor.promise.when([pFirstName, pLastName, pSSN])
        .then(function(values) {
            return {
                "first": values[0],
                "last": values[1],
                "ssn": values[2]    // This value may or may not be on the DOM, how do I check it and provide an alternate value?
            };
        });
}

更新
当我继续我的研究时,我发现这更像是一个webdriver问题。而且,也许我需要拉蓝鸟。我不确定。

要回答下面的问题,“你觉得哪些失败是什么意思?” 假设$('#ssn') ElementFinder实际上没有找到与#ssn匹配的元素。 getText()方法将拒绝承诺并传递元素未找到错误。所以,我会出现以下两种情况:

<span id="firstname">Joe</span>
<span id="lastname">Smith</span>
<span id="ssn">123-45-6789</span>
getValues().then(res => console.log(res));

会返回{"first": "Joe","last":"Smith","ssn":"123-45-6789"}

在以下情况下,如果用户不应该看到SSN,而角度甚至不创建元素,我们可能会:

<span id="firstname">Joe</span>
<span id="lastname">Smith</span>
getValues().then(res => console.log());

我希望返回值应为:{"first":"Joe","last":"Smith"}{"first":"Joe","last":"Smith","ssn":""}

3 个答案:

答案 0 :(得分:1)

除非有更好的答案,否则我认为这可能就是答案(只是在getText()调用期间捕获拒绝)。

function getValues() {
let pFirstName = $('#firstname').getText().catch(() => "");
let pLastName = $('#lastname').getText().catch(() => "");
let pSSN = $('#ssn').getText().catch(() => "");

return protractor.promise.when([pFirstName, pLastName, pSSN])
    .then(function(values) {
        return {
            "first": values[0],
            "last": values[1],
            "ssn": values[2]
        };
    });
}

至少,当我在JSFiddle中做类似的事情时它会起作用:

&#13;
&#13;
function iffy(rVal, cond)  {
    return new Promise(function(resolve, reject) {
        if (cond) {
            resolve(rVal);
        } else {
    	    reject(new Error("This is in error"));
        }
    });
}

let pTruthy = iffy("true", true)
    .catch(() => "Caught the error");
let pFalsy = iffy("false", false)
    .catch(() => "Caught the error");

Promise.all([pTruthy, pFalsy])
    .then(values => console.log(values))
    .catch(err => console.log(err));

iffy("false", false)
    .then(val => console.log(val))
    .catch(err => console.log(err.toString()));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这是另一个想法 - 更多泛型 - 获取所有相关的span元素并使用reduce()返回带有输入ID和文本的对象:

var inputs = $$("span[id]");  // TODO: make the locator more specific
var values = inputs.reduce(function (obj, input) {
    return input.getAttribute("id").then(function (fieldName) {
        return input.getText().then(function (fieldValue) {
            obj[fieldName] = fieldValue;
        });
    });
}, {});

您也可以将{}更改为,例如{"firstname": "", "lastname": "", "ssn": ""},以获取不存在的字段的默认值。

答案 2 :(得分:0)

不是非常通用的方法,但您可以检查SSN字段是否明确存在。这些方面的东西:

function getValues() {
    let pFirstName = $('#firstname').getText();
    let pLastName = $('#lastname').getText();
    let isSSNPresent = $('#ssn').isPresent();
    return protractor.promise.all([pFirstName, pLastName, isSSNPresent]).then(function(values) {
        let result = {
            "first": values[0],
            "last": values[1]
        };

        if (values[2]) {
            $('#ssn').getText().then(function (ssn) {
                result.ssn = ssn
            });
        } 
        return result;
    });
}

(未经测试)