使用 puppeteer 在 table 中获取元素句柄
Getting element handle within table using puppeteer
我正在和木偶师一起工作。如屏幕截图所示,我有一个 table。我需要能够在根据左侧的名称列选择行后连续单击正在操作的按钮。
基于
我有:
const parent = await page.$eval('td[title="18to22"]', el => el?.parentElement?.outerHTML)
这确实有效并为父元素提供了 html 但我想获取父元素句柄 (https://puppeteer.github.io/puppeteer/docs/next/puppeteer.elementhandle/
) 然后是最后一个应该包含可点击视图按钮的子元素句柄。
我试过了:
const parent = await targetPage.$$eval(
'td[title="18to22"]',
(el) => el?.parentElement
);
这会产生未定义的结果。
如何获得父元素和最终的子元素句柄?
我相信您无法将已求值的元素转换回 ElementHandle。
我会执行以下操作来实现您的需求:
- 获取
page.$$eval
行的内容(returns 字符串数组)
- 使用
Array.findIndex()
获取包含所需名称 ('18to22') 的行的索引
- 现在你知道索引了,你需要用一个数字递增它(因为 CSS 的
nth-child()
pseudo-class 使用从 1 开始的数字,而不是像常规的那样从 0 开始JS 数组)
- 因此您可以使用以下 CSS 选择器来抓取确切的行:
tbody > tr:nth-child(${wantedRowIndex + 1})
- ...第五列包含按钮:
> td:nth-child(5)
- ...按钮在我看来是一个
<a>
元素,因此您可以在选择器末尾添加 > a
以定位要单击的 link
- 终于可以在
page.$eval
的页面函数中应用HTMLElement.click()
了
示例:
const rows = await page.$$eval('tbody > tr', elems => elems.map(el => el.innerText))
const wantedRowIndex = rows.findIndex(el => el.includes('18to22'))
await page.$eval(`tbody > tr:nth-child(${wantedRowIndex + 1}) > td:nth-child(5) > a`, el => el.click())
我正在和木偶师一起工作。如屏幕截图所示,我有一个 table。我需要能够在根据左侧的名称列选择行后连续单击正在操作的按钮。
基于
我有:
const parent = await page.$eval('td[title="18to22"]', el => el?.parentElement?.outerHTML)
这确实有效并为父元素提供了 html 但我想获取父元素句柄 (https://puppeteer.github.io/puppeteer/docs/next/puppeteer.elementhandle/ ) 然后是最后一个应该包含可点击视图按钮的子元素句柄。
我试过了:
const parent = await targetPage.$$eval(
'td[title="18to22"]',
(el) => el?.parentElement
);
这会产生未定义的结果。
如何获得父元素和最终的子元素句柄?
我相信您无法将已求值的元素转换回 ElementHandle。
我会执行以下操作来实现您的需求:
- 获取
page.$$eval
行的内容(returns 字符串数组) - 使用
Array.findIndex()
获取包含所需名称 ('18to22') 的行的索引
- 现在你知道索引了,你需要用一个数字递增它(因为 CSS 的
nth-child()
pseudo-class 使用从 1 开始的数字,而不是像常规的那样从 0 开始JS 数组) - 因此您可以使用以下 CSS 选择器来抓取确切的行:
tbody > tr:nth-child(${wantedRowIndex + 1})
- ...第五列包含按钮:
> td:nth-child(5)
- ...按钮在我看来是一个
<a>
元素,因此您可以在选择器末尾添加> a
以定位要单击的 link - 终于可以在
page.$eval
的页面函数中应用
HTMLElement.click()
了
示例:
const rows = await page.$$eval('tbody > tr', elems => elems.map(el => el.innerText))
const wantedRowIndex = rows.findIndex(el => el.includes('18to22'))
await page.$eval(`tbody > tr:nth-child(${wantedRowIndex + 1}) > td:nth-child(5) > a`, el => el.click())