我正在使用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;
});
任何建议,如何跳过这些空行并仍然执行我的测试脚本?
感谢您的答复!
答案 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;
};