Как щелкать элементы в окнах всплывающих / новых вкладок в 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;
    }));
}
Другие вопросы по тегам