Javascript 如何在量角器中访问节点列表元素的属性
我正在尝试用量角器从一个相当大的HTML表中读取值(大约1000行5列)。 量角器的元素.all().getText()方法在这方面非常慢,因此我决定使用browser.executeScript实现一个直接读取值的解决方案,如:Javascript 如何在量角器中访问节点列表元素的属性,javascript,html,protractor,nodelist,Javascript,Html,Protractor,Nodelist,我正在尝试用量角器从一个相当大的HTML表中读取值(大约1000行5列)。 量角器的元素.all().getText()方法在这方面非常慢,因此我决定使用browser.executeScript实现一个直接读取值的解决方案,如: async getTextFromHtmlTable(){ try{ var rows = element.all(by.css('table[id^="P"] tr')); var numRows = await rows.c
async getTextFromHtmlTable(){
try{
var rows = element.all(by.css('table[id^="P"] tr'));
var numRows = await rows.count();
var arrRows = [];
for (var i = 2; i <= numRows; i++){
console.log("********Processing row: " + i);
var css = 'table[id^=\"P\"] tr:nth-child(' + i + ') td div div';
//**Slow solution: var arrRowsText = await element.all(by.css(css)).getText();
//Faster:
var arrRowsText = await browser.executeScript("return document.querySelectorAll('" + css + "')").then(function(elements){
var arrayRes = [];
for (var j=0; j<elements.length; j++){
console.log("****** Element text: " + elements[j].textContent);
arrayRes.push(elements[j].textContent);
}
return arrayRes;
});
arrRows.push(arrRowsText.join(';').replace(/;\s/gm, ";"));
}
return arrRows;
}catch(err){
console.log ('Some error: ' + err)
};
}
async getTextFromHtmlTable(){
试一试{
var rows=element.all(by.css('table[id^=“P”]tr');
var numRows=wait rows.count();
var arrRows=[];
对于(var i=2;i而言,节点列表似乎是通过executeScript
方法作为webElements数组返回的,因此getText()
应该可以工作。您也不需要使用。然后()
当某些东西已经等待时。您可以尝试下面的代码吗
async getTextFromHtmlTable(){
try{
var rows = element.all(by.css('table[id^="P"] tr'));
var numRows = await rows.count();
var arrRows = [];
for (var i = 2; i <= numRows; i++){
console.log("********Processing row: " + i);
var css = 'table[id^=\"P\"] tr:nth-child(' + i + ') td div div';
//**Slow solution: var arrRowsText = await element.all(by.css(css)).getText();
//Faster:
var arrRowsText = await browser.executeScript("return document.querySelectorAll('" + css + "')");
let allEleText = [];
for(let j = 0; j < arrRowsText.length; j++){
allEleText.push(await arrRowsText[j].getText());
}
arrRows.push(allEleText.join(';').replace(/;\s/gm, ";"));
}
return arrRows;
}catch(err){
console.log ('Some error: ' + err)
};
}
async getTextFromHtmlTable(){
试一试{
var rows=element.all(by.css('table[id^=“P”]tr');
var numRows=wait rows.count();
var arrRows=[];
对于(var i=2;i我终于找到了解决方案,DublinDev告诉我executeScript不返回节点列表,这是正确的方向。因此我考虑在executeScript方法中处理节点列表,让它返回一个文本数组,而不是实际的节点列表:
var arrRowsText = await browser.executeScript("return (function(){" +
"var nodes = document.querySelectorAll('" + css + "');" +
"var arrayRes = [];" +
"for (var j=0; j<nodes.length; j++){" +
" arrayRes.push(nodes[j].innerText);" +
"}" +
"return arrayRes;" +
"})();");
var arrRowsText=await browser.executeScript(“return(function(){”+
“var nodes=document.querySelectorAll(“+css+”);”+
“var arrayRes=[];”+
“对于(var j=0;jI尝试了您的建议,效果很好,但缺点是getText()非常慢,正如我所说的(检索1000行5列的文本大约需要7分钟),我想尝试一种不同的、更快的方法,而不是使用WebElements。因此,可能无法使用量角器访问HTML节点的属性?