我的问题如下。我在页面上有几个链接,我必须遵循这些链接,然后返回到同一个页面。我试着用以下方式做这件事:
const els = await page.$$('div[name="olymp"] a'); // get links on the page
for (let i = 0; i < els.length; i++) {
await els[i].click(); // clicking on a link that leads to another page
await page.waitForLoadState('networkidle');
await page.click('div.floating:nth-child(1)');
await page.click('div.floating:nth-child(1) div.extra a') // a link on another page that leads to the first page
}
我在第二次迭代中遇到了错误:elementHandle.click: Protocol error (DOM.describeNode): Cannot find context with specified id
可能有人遇到了类似的错误?我正在使用剧作家v1.13
发布于 2021-08-13 18:55:53
该问题在循环的第二次迭代中,元素句柄已被释放。在两个剧作家和木偶戏手的资源被转储后,页面提交导航。与其对每个元素句柄进行操作,不如尝试如下所示:
const linksCount = await page.$$eval('div[name="olymp"] a', (links) => links.length);
for (let i = 0; i < linksCount; i += 1) {
await Promise.all([
page.$$eval('div[name="olymp"] a', links => links[i].click()),
page.waitForLoadState('networkidle')
]);
await page.click('div.floating:nth-child(1)');
await Promise.all([
page.click('div.floating:nth-child(1) div.extra a'),
page.waitForLoadState('networkidle')
]);
}
注意,如果单击这些链接会导致导航/页面重新加载,则可能希望使用page.waitForNavigation
而不是page.waitForLoadState
。每当您执行一些触发导航(如单击链接)的操作时,将其与上面的Promise.all
包在一起是一种良好的做法,以防止出现争用情况。
来源:
https://playwright.dev/docs/api/class-page#page-wait-for-navigation https://github.com/puppeteer/puppeteer/issues/2258
https://stackoverflow.com/questions/68772652
复制相似问题