在protractor-typescript框架中使用Typescript迭代HTML表格以获取Cell

问题描述 投票:0回答:2

我在量角器 - 黄瓜框架中使用typescript编写e2e测试。对于我的测试,我想将UI中的HTML表与黄瓜数据表进行比较。最初,我所做的只是尝试获取每个单元格文本。但我正面临着遍历表格的问题。这是我的代码,我是打字稿和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:无法读取上面的undefined属性'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());
  }
}

在控制台上为这一个打印出一堆乱码。我的最终目标是将单元格放在一个二维数组中,这样我就可以使用chai库来断言黄瓜表,其中包含我在此处形成的二维数组。有人可以指出我正确的方向。

我无法在这里发布DOM,因为它是一个敏感的信息。但该表与任何具有表id,tbody,th,tr,td标记的HTML表非常相似

typescript html-table protractor
2个回答
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);

              });
            });
        }    

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);
      });
   });
}
© www.soinside.com 2019 - 2024. All rights reserved.