在量角器-类型脚本框架中使用类型脚本遍历HTML表以获取单元格

时间:2018-07-20 04:43:03

标签: typescript html-table protractor

我正在使用量角器-黄瓜框架中的打字稿编写e2e测试。对于我的测试,我想将UI中的HTML表与黄瓜数据表进行比较。最初,我要做的就是尝试获取每个单元格的文本,但是我面临遍历表格的问题。这是我的代码,我是Typescript和javascript的新手,我混合了所有语法。如果代码看起来不好,请原谅。任何指针都表示赞赏。

getCellText() {
    console.log('I am here');
    //'brickletrows' is my page object equivalent of 'tbody tr'       
    this.brickletrows.array.forEach(element => {
      let cells = element.$$('td');
      console.log(cells.getText);
    });
  }

我收到错误消息:TypeError:无法读取上述属性的未定义属性'forEach'

 async getCelltexts() {
//this.Bricklet_table_columns is my page object the equivalent of 'tbody tr td'
let someArray = [this.Bricklet_table_columns];
for (let cell of someArray) {
  {
    await console.log(cell.getText());
  }
}

} 在控制台上为此打印了一堆乱码。 我的最终目标是将单元格放置在2D数组中,以便我可以使用chai库使用我在此处形成的2D数组声明黄瓜表。 有人可以指出我正确的方向。

我无法在此处发布DOM,因为它是敏感信息。但是该表与任何具有表ID,tbody,th,tr,td标签的HTML表非常相似

2 个答案:

答案 0 :(得分:0)

为了能够以正确的顺序存储元素,我们可以依靠索引。 ElementArrayFinder.each()在其回调中提供索引作为第二个参数。 由于您要比较整个表,因此逐行比较就足够了,并且不必将所有值都作为单个值。新功能看起来会更好一些,如下所示:

async getCellValues(): Promise<string[]> {
    return new Promise<string[]>(async function (resolve, reject) {
      let table = element(by.css('#myTableID'));
      let rows = table.all(by.css('tr'));
      let rowCount = await rows.count();
      let rowValues = new Array(rowCount);
      rows.each(async (row, index) => {
        let text = await row.getText();
        rowValues[index] = text.trim();
      }).then(function() { 
        resolve(rowValues);
      });
   });
}

答案 1 :(得分:0)

因此,以下代码在某种程度上可以正常工作-从某种意义上说,它可以遍历表,但是当我尝试与数据表进行比较时-它失败了,这是因为推送到2D数组的元素顺序是随机的。我认为.each()函数正在异步工作-您是否对我可以解决这个问题有一个了解?

 getCellValues(): Promise<string[][]> {
            return new Promise<string[][]>(function (resolve, reject) {
              let allValues = [];               
              // take all 'tr' child elements and iterate them using 'each()'                
              Brick_table_rows1.each(function(el){
                  //console.log("el text " + el.toString());
                // create sub arr for filling one row in   
                let subArr = [];   

                // take a row and process each element
                el.all(by.css('td')).each(function(subEl){
                    //console.log("subEl text: " + subEl.toString()); 
                  // get text of one row element
                  subEl.getText().then(function(text)  {

                    // at the point we receive the text add it to sub array.
                    subArr.push(text);   
                    console.log("subarr text: " + subArr.toString());                  
                  });
                }).then(function () {                 
                  allValues.push(subArr);                
                  console.log("arr text: " + allValues.toString()); 
                });
              }).then(function() {                               
                resolve(allValues);

              });
            });
        }