我看到我可以使用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":""}
答案 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中做类似的事情时它会起作用:
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;
答案 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;
});
}
(未经测试)