Javascript 从量角器页对象返回对象
我有一个像这样的HTML表Javascript 从量角器页对象返回对象,javascript,angularjs,selenium,jasmine,protractor,Javascript,Angularjs,Selenium,Jasmine,Protractor,我有一个像这样的HTML表 <table> <tr ng-repeat='row in Entity'> <td>row.Name</td> <td>row.Surname</td> <td>row.Address</td> </tr> </table> 我可以使用map(),但是传递所有tr将返回表中的所有对象(这是一个非常长的表,它从map
<table>
<tr ng-repeat='row in Entity'>
<td>row.Name</td>
<td>row.Surname</td>
<td>row.Address</td>
</tr>
</table>
我可以使用map()
,但是传递所有tr
将返回表中的所有对象(这是一个非常长的表,它从map
加载所有项目大约10秒),传递确切的tr
将返回每个td
的三个值
我该怎么办?有很多方法。您可以使用函数获取所需的数据,方法如下-
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];
});
};
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;
});
};
另一种简单的方法是使用内置函数,该函数返回应用了过滤器的元素,在您的情况下,它将是行号。这是使用它的方法-
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;
});
};
另一种方法是使用函数。这是怎么做的-
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];
});
};
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;
});
};
在您的测试规范中使用上述方法对于这两种方法都是一样的,因为它们将承诺返回给调用函数-
returnObject(0).then(function(obj){ //Return the object for first <tr> as both get() and filter() are 0 index based functions
console.log(obj);
});
returnObject(0)。然后(函数(obj){//首先返回对象,因为get()和filter()都是0个基于索引的函数
控制台日志(obj);
});
希望有帮助。这里使用的是中继器吗?(假设您简化了输入的HTML)谢谢。是的,我正在使用一个转发器来显示行。您能不能按原样显示表格的HTML源代码而不进行修饰?谢谢。这是一种更困难的方法,我甚至不使用这些数据。可能有用:有这个
行
和列
概念。虽然map()
听起来是一个很好的解决方法。哇,这真的很难看(不是说这很糟糕吧?),但我真正的web使用大约12列,这将是一个巨大的功能。@J.J.Bocanegra如果有12列,那么你就不用循环来获取所有列数据了。我以为只有三个,所以我不使用循环。我认为没有其他方法可以从承诺中获取返回的数据并将其存储为对象的形式。但是如果您的列元素有任何可以显示的特殊属性,那么我们可能可以减少整个函数。谢谢