为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

神不在的星期二 2022-09-02 20:55:15
我正在尝试从量角器中相当大的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”。我做错了什么吗?感谢您的帮助!
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我终于找到了解决这个问题的方法,DublinDev为我指出了正确的方向,他说expertScript不返回NodeLists。因此,我考虑在 executeScript 方法中处理 NodeList,并让它返回一个文本数组,而不是实际的 NodeList:


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;" +

            "})();");

现在它就像一个魅力,元素文本使用innerText比使用getText()更快地读取。


查看完整回答
反对 回复 2022-09-02
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

节点列表似乎通过该方法作为 webElements 数组返回,因此应该可以正常工作。当某些东西已经被编辑时,你也不需要使用。你能试试下面的代码吗?executeScriptgetText().then()await


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)

  }; 

}


查看完整回答
反对 回复 2022-09-02
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信