我正在编写一个 Protractor 测试,它必须等待元素属性具有非空值,然后我想将该值返回给调用函数。事实证明这比我想象的更难写!
我能够正确安排 browser.wait()
命令来等待元素属性具有非空值,并且我已经验证该值实际上是我所期望的进入回调函数,但出于某种原因,我无法在回调函数之外返回该值并返回到测试代码的其余部分。
这是我的代码的样子:
function test() {
var item = getItem();
console.log(item);
}
function getItem() {
var item;
browser.wait(function() {
return element(by.id('element-id')).getAttribute('attribute-name').then(function(value) {
item = value;
// console.log(item);
return value !== '';
});
});
return item;
}
我可以看出执行顺序与我预期的不一样,因为当我取消注释回调函数内的 console.log()
调用时,我看到打印出的预期值.但是,test()
函数中的相同调用会打印“undefined”。
这是怎么回事?我错过了什么?如何从回调函数中正确获取属性值?
感谢您的帮助。
最佳答案
我不会合并等待和获取属性部分 - 从逻辑上讲,它们是两个独立的部分,将它们分开:
browser.wait(function() {
return element(by.id('element-id')).getAttribute("attribute").then(function(value) {
item = value;
// console.log(item);
return value !== '';
});
});
element(by.id('element-id')).getAttribute("attribute").then(function (value) {
console.log(value);
});
请注意,您可以这样简化等待条件:
var EC = protractor.ExpectedConditions;
var elm = $('#element-id[attribute="expected value"]');
browser.wait(EC.presenceOf(elm), 5000);
elm.getAttribute("attribute").then(function (value) {
console.log(value);
});
仅供引用,您可能已经使用 deferred
解决了当前的问题:
function test() {
getItem().then(function (value) {
console.log(value);
});
}
function getItem() {
var item = protractor.promise.defer();
browser.wait(function() {
return element(by.id('element-id')).getAttribute('attribute').then(function(value) {
var result = value !== '';
if (result) {
item.fulfill(value);
}
return result;
});
});
return item.promise;
}
关于javascript - 在 Protractor 中获取元素属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961197/