首页 > 解决方案 > 如何使用 Puppeteer 处理弹出窗口

问题描述

我正在编写一个脚本来在亚马逊上购买商品。

const puppeteer = require('puppeteer');

// Insert personal credentials
const email = '';
const password = '';

function press_enter(page) {
    return Promise.all([
        page.waitForNavigation({waitUntil:'networkidle2'}),
        page.keyboard.press(String.fromCharCode(13))
      ]);
}

function click_wait(page, selector) {
    return Promise.all([
        page.waitForNavigation({waitUntil:'networkidle2'}),
        page.click(selector)
      ]);
}

(async () => {
  const browser = await puppeteer.launch({headless:false, defaultViewport:null, args: ['--start-maximized']});
  const page = (await browser.pages())[0];
  await page.goto('https://www.amazon.it/');
  await click_wait(page, "a[data-nav-role='signin']");
  await page.keyboard.type(email);
  await press_enter(page);
  await page.keyboard.type(password);
  await press_enter(page);

  // Search for the "signout" button as login proof
  if(await page.$('#nav-item-signout') !== null) console.log('Login done!');
  else return console.log('Something went wrong during login');

  // Navigate to the product page
  await page.goto('https://www.amazon.it/dp/B07RL2VWXQ');

  // Click "buy now" (choose either Option A or Option B)

    // Option A: Here the code get stuck since the page isn't refreshing and page.waitForNavigation() will reach its timeout
    // await click_wait(page, "#buy-now-button");

    // Option B: Waiting time manually set to 5 seconds (it should be more than enough for popover to fully load)
    await Promise.all([page.waitForTimeout(5000), page.click('#buy-now-button')]);

  // Conclude the purchase
  await click_wait(page, '#turbo-checkout-pyo-button');
})();

到目前为止,我可以登录亚马逊,导航到产品页面并单击“立即购买”按钮。
然后,如果送货地址和付款选项都设置好了,(取决于亚马逊域名)它可能会显示一个弹出框来结束购买。
我无法在 和 上复制弹出框响应.com.co.uk这些域似乎会将您重定向到一个全新的页面。

亚马逊.it

当我使用 Chrome 开发人员工具浏览页面时,我实际上看到了正在加载的页面的新块 ( <!DOCTYPE html>),但我不知道这个元素的表示在 Puppeteer 中的位置。

如果我使用click_wait()单击Buy Now,脚本会卡住(它仅在默认超时后返回page.waitForNavigation()),因此它不被视为页面刷新。但是,即使我在单击“立即购买”后等待几秒钟,然后尝试单击input[id='turbo-checkout-pyo-button'](橙色按钮“Ordina”),Puppeteer 也会引发错误,因为它无法找到该元素,尽管它已被明确加载。

标签: javascriptajaxweb-scrapingdialogpuppeteer

解决方案


推荐阅读