Как щелкать элементы в окнах всплывающих / новых вкладок в Puppeteer
Я использовал следующий пример, чтобы настроить таргетинг на всплывающее окно / newtab, но методы, доступные мне после этого, ограничены. Я действительно могу делать только такие вещи, как захват URL и закрытие вкладки (среди прочего).
То, что я пытаюсь сделать, это взаимодействовать со знаком Google / Twitter во всплывающем окне, но у кукловода нет решения для нескольких дескрипторов окна, по крайней мере, при попытке взаимодействия, как в элементах клика.
const newPagePromise = new Promise(x => browser.once('targetcreated', target => x(target.page()));
await page.click('my-link'); //Opens pop-up window
const newPage = await newPagePromise;
Я ищу что-то вроде этого (в дополнение к коду, написанному выше):
const element = await newPage.$(selector);
await element.click();
Это не работает. У кого-нибудь еще была такая необходимость?
1 ответ
Возьми это с зерном соли. Я работаю с кукловодом так, что документация API не рекомендует, поэтому мне пришлось перевести кое-что из того, что вы видите ниже.
Я рад ответить на любые дополнительные вопросы.
В целом, это решение позволяет вам открывать новую вкладку / всплывающее окно и взаимодействовать с этой вкладкой / всплывающим окном. Мне даже удалось закрыть всплывающее окно и переключиться обратно на исходную страницу, которая не упоминается ниже.
const newPagePromise = getNewPageWhenLoaded()
await page.click('my-link'); //Opens pop-up window
const newPage = await newPagePromise;
newPage = newPage.mainFrame();
const element = await newPage.waitForSelector('img');
newPage.click(element);
function getNewPageWhenLoaded() {
return new Promise((x) => browser.once('targetcreated', async (target) => {
const newPage = await target.page();
const newPagePromise = new Promise(() => newPage.once('domcontentloaded', () => x(newPage)));
const isPageLoaded = await newPage.evaluate(() => document.readyState);
return isPageLoaded.match('complete|interactive') ? x(newPage) : newPagePromise;
}));
}