猿问

如何访问量角器中 NodeList 元素的属性

我正在尝试从量角器中相当大的HTML表中读取值(大约一千行和5列)。Protractor的element.all().getText()方法在这方面非常慢,所以我决定使用browser.executeScript实现一个解决方案来直接读取值,例如:


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)

    }; 

}

但是,执行测试时的控制台输出为:


处理行:569

****** 元素文本:未定义的

****** 元素文本:未

定义的 ****** 元素文本:未定义的

****** 元素文本:未定义的

****** 元素文本:未定义的

******** 处理行:570

****** 元素文本:未定义的

****** 元素文本:未定义的

****** 元素文本:未定义的

****** 元素文本:未定义的

****** 元素文本:未定义的 ****** 元素文本:未定义的 ****** 元素文本:未定义的 ****** 元素文本:未定义的


无论我阅读什么属性(textContent,innerText,innerHTML...),它总是返回“undefined”。我做错了什么吗?感谢您的帮助!


神不在的星期二
浏览 99回答 2
2回答

噜噜哒

我终于找到了解决这个问题的方法,DublinDev为我指出了正确的方向,他说expertScript不返回NodeLists。因此,我考虑在 executeScript 方法中处理 NodeList,并让它返回一个文本数组,而不是实际的 NodeList:var arrRowsText = await browser.executeScript("return (function(){" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "var nodes = document.querySelectorAll('" + css + "');" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "var arrayRes = [];" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "for (var j=0; j<nodes.length; j++){" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "&nbsp; arrayRes.push(nodes[j].innerText);" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "}" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "return arrayRes;" +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "})();");现在它就像一个魅力,元素文本使用innerText比使用getText()更快地读取。

犯罪嫌疑人X

节点列表似乎通过该方法作为 webElements 数组返回,因此应该可以正常工作。当某些东西已经被编辑时,你也不需要使用。你能试试下面的代码吗?executeScriptgetText().then()awaitasync getTextFromHtmlTable(){&nbsp; try{&nbsp; &nbsp; &nbsp; var rows = element.all(by.css('table[id^="P"] tr'));&nbsp; &nbsp; &nbsp; var numRows = await rows.count();&nbsp; &nbsp; &nbsp; var arrRows = [];&nbsp; &nbsp; &nbsp; for (var i = 2; i <= numRows; i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log("********Processing row: " + i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var css = 'table[id^=\"P\"] tr:nth-child(' + i + ') td div div';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //**Slow solution: var arrRowsText = await element.all(by.css(css)).getText();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Faster:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var arrRowsText = await browser.executeScript("return document.querySelectorAll('" + css + "')");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let allEleText = [];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(let j = 0; j < arrRowsText.length; j++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allEleText.push(await arrRowsText[j].getText());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arrRows.push(allEleText.join(';').replace(/;\s/gm, ";"));&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; return arrRows;&nbsp;&nbsp; }catch(err){&nbsp; &nbsp; &nbsp; console.log ('Some error: ' + err)&nbsp; };&nbsp;}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答