在 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
我的问题如下。我在页面上有几个链接,我必须遵循这些链接,然后 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