table 单元格的第 n 个子单元中的 Puppeteer select link

Puppeteer select link in nth child of table cell

我有一个功能:

const tableData = await page.evaluate(() => {
 const tds = Array.from(document.querySelectorAll('table tbody tr td'))
 for (var i = 0; i < tds.length; i++) {
 ...
 ...
  availableDates.push([i,dateString,day])
 }
 return availableDates
}

并且此函数循环 table 的所有单元格,我根据某些条件过滤一些日期。

到目前为止一切顺利。这些单元格包含一个我想单击的 href。该数组包含我想在第一个数组项上单击的单元格的编号,所以我尝试过:

await page.focus('table tbody tr td:nth-child('+tableData[0][0]+') a' )
    await page.keyboard.type('\n');

但运气不好。我收到以下错误消息:

(node:81325) UnhandledPromiseRejectionWarning: Error: No node found for selector: table tbody tr td:nth-child(109) a
.......

我必须改变什么?谢谢。

CSS 选择器不是这样工作的。您不能执行 td:nth-child(109) 并期望选择不同 table 行中的元素。我会尝试通过 page.clickpage.evaluate(() => element.click);

使用 .click()

输入 \n 似乎是一个错误的方向,明确调用 click - 这是我的建议。

Api 对于 page.click: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageclickselector-options

当谈到实际找到正确的单元格时,我会在更高的范围(闭包)中使用辅助数组,将所有内容添加到那里(一维数组)然后你可以通过数字引用它们,比如你尝试使用 nth-child 方法。

这行不通,因为,让我解释一下原因:

您有 2 张桌子。

  • Table 1 有 3 个 tds。
  • Table 2 有 2 个 tds。

现在,如果你做 $('table td:nth-child(2)') 这将意味着 Table 1s 2nd td,也就是 Table 2 第 2 个 td.


你大概可以做两件事,

  1. 在遍历 dom 元素时,向元素添加数据属性,并 select 使用该数据属性。

    const tableData = await page.evaluate(() => {
      const tds = Array.from(document.querySelectorAll('table tbody tr td'))
      for (var i = 0; i < tds.length; i++) {
        // ...
        tds[i].setAttribute('data-td-index', i);
        // ...
        availableDates.push([i, dateString, day])
      }
      return availableDates;
    }
    

    然后,使用该数据属性。

    await page.focus('table tbody tr td[data-td-index='+tableData[0][0]+'] a' )
    
  2. 使用DOM元素这里get thee unique selector的其中一种解决方案,保存在 availableDatesavailableDates.push(i, uniqPath, dateString, day)。 然后像这样使用它:

    await page.focus(`${tableData[0][0]} a`)