我正在编写一个Protractor测试,必须等待一个元素属性具有非空值,然后我想将该值返回给调用函数.事实证明这比我预期的要难得多!
我能够正确地安排一个browser.wait()命令来等待element属性具有非空值,并且我已经验证了这个值实际上是我期望在回调函数中获得的,但对于某些原因是,我无法在回调函数之外将其返回到测试代码的其余部分.
以下是我的代码的样子:
- 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’.
这里发生了什么?我错过了什么?如何正确地从回调函数中获取属性值?
我感谢您的帮助.
解决方法
我不会将wait和getting属性部分组合在一起 – 逻辑上这些是两个独立的东西,将它们分开:
- 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);
- });
- 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;
- }