如何在 Puppeteer 上跟踪弹出模式
How to track pop-up modal on Puppeteer
const products = await page.$$('.product-list li .hover-overlay');
for (var a = 2; a <= products.length; a++) {
await Promise.all([
page.hover(`.product-list li:nth-child(${a}) .hover-overlay`),
page.click(`.product-list li:nth-child(${a}) .hover-overlay`),
page.waitForSelector('.modal', { visible: true }),
page.waitForSelector('.save-btn', { visible: true }),
page.click('.save-btn'),
])
}
这是错误
Error: No node found for selector: .save-btn
木偶师:^1.7.0
节点:v9.4.0
Promise.all
会让所有的承诺 运行 同时实现,所以在这里你同时悬停并点击一个特定的元素,等待两个选择器,然后点击一个与最后一个匹配的元素一。您也可以通过在循环内使用 await
来按顺序执行这些操作:
const products = await page.$$('.product-list li .hover-overlay');
for (const overlay of products.slice(2)) {
await overlay.hover();
await overlay.click();
await page.waitForSelector('.modal', { visible: true });
const button = await page.waitForSelector('.save-btn', { visible: true });
await button.click();
await page.waitForFunction('.modal', { hidden: true });
}
我使用对元素本身的引用来避免重复搜索它们。我假设您在点击之前在叠加层上调用 hover
,因为如果不首先悬停,页面将不会注册点击;如果不是这种情况,您可以完全省略 hover
。
const products = await page.$$('.product-list li .hover-overlay');
for (var a = 2; a <= products.length; a++) {
await Promise.all([
page.hover(`.product-list li:nth-child(${a}) .hover-overlay`),
page.click(`.product-list li:nth-child(${a}) .hover-overlay`),
page.waitForSelector('.modal', { visible: true }),
page.waitForSelector('.save-btn', { visible: true }),
page.click('.save-btn'),
])
}
这是错误
Error: No node found for selector: .save-btn
木偶师:^1.7.0
节点:v9.4.0
Promise.all
会让所有的承诺 运行 同时实现,所以在这里你同时悬停并点击一个特定的元素,等待两个选择器,然后点击一个与最后一个匹配的元素一。您也可以通过在循环内使用 await
来按顺序执行这些操作:
const products = await page.$$('.product-list li .hover-overlay');
for (const overlay of products.slice(2)) {
await overlay.hover();
await overlay.click();
await page.waitForSelector('.modal', { visible: true });
const button = await page.waitForSelector('.save-btn', { visible: true });
await button.click();
await page.waitForFunction('.modal', { hidden: true });
}
我使用对元素本身的引用来避免重复搜索它们。我假设您在点击之前在叠加层上调用 hover
,因为如果不首先悬停,页面将不会注册点击;如果不是这种情况,您可以完全省略 hover
。