我有一个特定的用例,在测试代码中我想获取表头(异步),然后在 JavaScript 对象上动态创建 getter。我想在测试中使用的语法是 antenneTable.row(0).getAzimut();
。我遇到的问题是 antenneTable.row(0);
返回一个 promise ,因此 getAzimut 尚未在该对象上定义。
如果我使用antennetable.row(0).then(),我知道如何修复它,但想保留语法。
提前致谢
这是我的代码:
Row.js
'use strict';
var Row = function (row, classes) {
var outer = this;
function camelCase(input) {
return input.toLowerCase().replace(/-(.)/g, function(match, group1) {
return group1.toUpperCase();
})}
for(var i =0 ; i< classes.length; i ++){
var methodName = camelCase("get-"+classes[i]);
(function(index) {
outer[methodName] = function () {
return row.all(by.tagName('td')).get(index).getText();
}
})(i);
}
};
module.exports = Row;
表.js
'use strict';
var Row = require('./row.js');
var Table = function (tableElement) {
var headElement = tableElement.element(by.css('thead'));
var bodyElement = tableElement.element(by.css('tbody'));
this.row = function (index) {
return headElement.all(by.css('th')).map(function (th) {
return th.getAttribute('class');
}).then(function (clazzes) {
var rows = bodyElement.all(by.css('tr'));
return new Row(rows.get(index), clazzes);
})
};
};
module.exports = Table;
MyTestClass.js
'use strict';
describe('dossier map', function(){
var mainPage = require('../../pages/mainpage.js');
var DossierDetailPage = require('../../pages/dossier/dossier-detail.js');
var Table = require('../../pages/table.js');
var dossierDetailPage = new DossierDetailPage();
afterEach(function() {
resetData();
mainPage.logout();
});
it('antenne details popup verschijnt', function() {
// TODO Activate test in Firefox and IE
if (!browser.isFirefox && !browser.isIE) {
mainPage.goTo('admin', 'admin');
mainPage.dossiers().byIndex(7).openDetail();
dossierDetailPage.zoomOut(5);
var popoverElement = element(by.css('#popover .popover'));
browser.driver.wait(function() {
return popoverElement.isPresent().then(function(isDisplayed){
if (isDisplayed) {
return true;
}
else {
dossierDetailPage.klikOpAntenneCluster(11);
return false;
}
});
});
var antenneTable = new Table(popoverElement.element(by.css('table')));
expect(antenneTable.row(0).getAzimut()).toBe('115');
}
}, 120000);
});
最佳答案
异步/等待
有一个名为 async/await 的库(受到 C#
版本 5 的启发)
这使得您的 promise 代码外观和感觉同步
例如
var Q = require("q");
var async = require('asyncawait/async');
var await = require('asyncawait/await');
function delay(millis) {
var deferred = Q.defer();
setTimeout(deferred.resolve, millis);
return deferred.promise;
}
async(function () {
console.log('message 1');
await(delay(100));
console.log('message 2');
})();
- 必须托管在 NodeJS 环境
- 出色的编码用户体验
关于javascript - 停止 JavaScript 执行,直到 Promise 得到解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30934992/