无法读取null的属性“ getAttribute”

时间:2019-07-10 19:09:30

标签: javascript puppeteer

我正在使用puppeteer测试我的网站的前端。但是,当我在表格中显示横幅时,出现错误

我的html table-body如下所示:

<tbody>
   <tr role="row" class="odd">
      <td tabindex="0">7/9/2019</td>
      <td>Product 1</td>
      <td>Active</td>
      <td><a href="test">Category 1</a></td>
   </tr>
   <tr role="row" class="even">
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
      <td style="width: 0; padding: 0"></td>
   </tr>

我的page.evaluate()代码如下:

                data = await page.evaluate(async () => {
                    let data = [];
                    let grabFromRow = (row, child) => {
                        const td = row
                            .querySelector(`td:nth-child(${child})`)
                        return td ? td.innerText.trim() : null
                    }
                    let grabLinkFromRow = (row, child) => {
                        const td = row
                            .querySelector(`td:nth-child(${child}) > a`).getAttribute("href");  // here I get the error
                        return td ? td : null;
                    };

                    let rows = "#producttable > tbody > tr"

                    let tableRows = document.querySelectorAll(rows)
                    for (const tr of tableRows) {
                        data.push({
                            date: grabFromRow(tr, 1),
                            product: grabFromRow(tr, 2),
                            status: grabFromRow(tr, 3),
                            category: grabFromRow(tr, 4),
                            categoryLink: grabLinkFromRow(tr, 4),
                        });
                    }
                    return data;
                });

任何建议,如何跳过这些空行并仍然执行我的测试脚本?

感谢您的答复!

3 个答案:

答案 0 :(得分:1)

您需要首先检查a标记是否可用,如果可用,则获取getAttribute并返回else返回null。

const td = row.querySelector(`td:nth-child(${child}) > a`);  // here I get the error
 if ( td ) {
    return td.getAttribute("href");
 }
    return null;

答案 1 :(得分:1)

在一条语句中编写链接的操作可能会导致此错误,因为如果链接的任何步骤失败,它可能返回public class Position2D implements Comparable<Position2D> { private int x, z; @Override public int compareTo(Position2D position2D) { int coordinatesSum = this.getX() + this.getZ(); int otherCoordinatesSum = position2D.getX() + position2D.getZ(); return Integer.compare(coordinatesSum, otherCoordinatesSum); } } null,然后尝试的任何其他操作都会失败。在undefined函数中,有以下行:

grabLinkFromRow

这里的问题是const td = row.querySelector(`td:nth-child(${child}) > a`).getAttribute("href"); 返回querySelector,因为该行中没有链接。这意味着您正在尝试调用null,从而导致错误。

您应该先确保找到链接,然后再继续执行以下操作:

null.getAttribute("href")

答案 2 :(得分:1)

您在其他功能grabFromRow中有一个正确的主意,您可以在其中将td设置为querySelector的结果并检查其真实性。

   let grabLinkFromRow = (row, child) => {
        const td = row
            .querySelector(`td:nth-child(${child}) > a`);
        return td ? td.getAttribute("href") : null;
   };