我有一个像这样的HTML表
<table>
<tr ng-repeat='row in Entity'>
<td>row.Name</td>
<td>row.Surname</td>
<td>row.Address</td>
</tr>
</table>
我想创建一个函数,该函数返回一个对象,其中包含我作为参数传递的行号的值,如:
{
name: 'name',
surname: 'surname',
address: 'address'
}
我可以使用map()
执行此操作,但是传递所有tr
将返回表中的所有对象(是一个非常长的表,它会加载{{1}中的所有项目大约10秒)并传递确切的map
将为每个tr
返回三个值。
我该怎么办?
答案 0 :(得分:1)
有很多方法可以做到这一点。您可以使用map()
功能获取所需的数据,具体如何 -
function returnObject(eleIndex){
return element.all(by.repeater('row in Entity')).map(function(elem, index){
return {
name: elem.$$('td').get(0).getText(),
sur: elem.$$('td').get(1).getText(),
addr: elem.$$('td').get(2).getText()
}
}).then(function(obj){
return obj[eleIndex];
});
};
另一个简单的方法是使用内置的filter()
函数,该函数返回应用了过滤器的元素,在您的情况下,它将是行号。在这里使用它 -
function returnObject(eleIndex){
var obj = {};
return element.all(by.css('tbody > tr')).filter(function(elem, index){
return index === eleIndex;
}).then(function(elem){
elem[0].$$('td').get(0).getText().then(function(name){
obj.name = name;
});
elem[0].$$('td').get(1).getText().then(function(surname){
obj.surname = surname;
});
elem[0].$$('td').get(2).getText().then(function(address){
obj.address = address;
});
return obj;
});
};
另一种方法是使用get()
功能。这是怎样的 -
function returnObject(eleIndex){
var elem = element.all(by.css('tbody > tr')).get(eleIndex);
var obj = {};
return browser.wait(EC.visibilityOf(elem), 5000).then(function(){
elem.$$('td').get(0).getText().then(function(name){
obj.name = name;
});
elem.$$('td').get(1).getText().then(function(surname){
obj.surname = surname;
});
elem.$$('td').get(2).getText().then(function(address){
obj.address = address;
});
return obj;
});
};
在测试规范中使用上述方法对于两者都是相同的,因为它们将一个promise返回给调用函数 -
returnObject(0).then(function(obj){ //Return the object for first <tr> as both get() and filter() are 0 index based functions
console.log(obj);
});
希望它有所帮助。