是否有protractor.promise.when()方法?



我看到我可以使用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?
            };
        });
}

更新:
随着我继续我的研究,我发现这更多的是一个网络驱动程序的问题。也许我需要把蓝鸟请来。我不确定。

要回答下面的问题,"哪些失败是什么意思?"假设$('#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, angular甚至没有创建元素,我们可能有:

<span id="firstname">Joe</span>
<span id="lastname">Smith</span>

getValues().then(res => console.log());
我希望返回值应该是:{"first":"Joe","last":"Smith"}{"first":"Joe","last":"Smith","ssn":""}

这是另一个想法-一个更通用的一个-获得所有相关的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": ""},以具有不存在的字段的默认值。

除非出现更好的答案,否则我认为这可能是答案(只需在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中做类似的事情时,它可以工作:

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

不是非常通用的方法,但是您可以检查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;
    });
}

(未测试)

最新更新