これが私のユースケースです:
クリックすると新しいタブが開き、コンテンツが読み込まれるリンクがあります。
私が探しているもの:
新しいタブが開いている間にページの参照を切り替える方法や、新しいタブの参照を作成する方法はありますか?
リンクがクリックされた後に開かれたページを取得するには、 popup
イベントをリッスンできます。ページが新しいタブまたはウィンドウを開いたときに発行されます。
コードサンプル(上記のリンク先のドキュメントから)
const [newPage] = await Promise.all([
new Promise(resolve => page.once('popup', resolve)),
page.click('a[target=_blank]'),
]);
これにより、現在のページでウィンドウが開くのを待っている間にリンクをクリックします。 newPage
が開かれたページになります。
代替アプローチ:開いているすべてのページのリストを取得するには、 browser.pages
:
const pages = await browser.pages();
pages
は、開いているすべてのページを含む配列になります。
次の機能を使用します。
let clickAndWaitForTarget = async (clickSelector, page, browser) => {
const pageTarget = page.target(); //save this to know that this was the opener
await page.click(clickSelector); //click on a link
const newTarget = await browser.waitForTarget(target => target.opener() === pageTarget); //check that you opened this page, rather than just checking the url
const newPage = await newTarget.page(); //get the page object
// await newPage.once("load",()=>{}); //this doesn't work; wait till page is loaded
await newPage.waitForSelector("body"); //wait for page to be loaded
return newPage;
};
そしてそれを使用します:
await page.waitForSelector('a[href="/admin"]');
page = await clickAndWaitForTarget('a[href="/admin"]', page, browser);
// Admin page
//console.log(JSON.stringify(page.target()));
await page.waitForSelector('a[href="/users"]');
現在、この問題をフォローすることができます https://github.com/GoogleChrome/puppeteer/pull/554 この機能がpuppeteer
にいつ追加されるかを知ることができます。または、JoelEinbinderがフォークしたレポを使用できます