在 JS 的剧作家测试中丢失上下文

Loosing context in playwrights test on JS

我的问题如下。我在页面上有几个链接,我必须遵循这些链接,然后 return 到同一页面。我尝试通过以下方式进行:

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 也许有人遇到过类似的? 我正在使用 Playwright v1.13

问题出在循环的第二次迭代上,元素句柄已被处理。在 playwright 和 puppeteer 中,资源在页面提交导航后被丢弃。不要对每个元素句柄进行操作,而是尝试这样的操作:

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')
    ]);
}

请注意,如果实际上单击这些 link 会导致 navigation/page 重新加载,则您可能希望使用 page.waitForNavigation 而不是 page.waitForLoadState。任何时候你正在执行一些触发导航的操作(比如点击 link),最好的做法是像上面那样用 Promise.all 包装它以防止竞争条件。

来源:

https://playwright.dev/docs/api/class-page#page-wait-for-navigation https://github.com/puppeteer/puppeteer/issues/2258