NodeJS 如何从Puppeteer中的弹出窗口读取

ih99xse1  于 2023-03-29  发布在  Node.js
关注(0)|答案(1)|浏览(158)

当预订网站显示近期有新的预约(例如通过取消)时,我试图收到通知。该网站是booksy.com。
我已经写了一个 puppet 脚本,它将导航到页面,并单击一个按钮,然后将打开一个弹出窗口,显示下一个可用的约会时的文本。该脚本的作品。
我的下一步是让脚本实际读取弹出窗口的内容。这一直是一个问题,因为它只是试图在弹出窗口打开之前读取原始页面。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto('https://booksy.com/en-gb/45005_gents-of-richmond_barber_311817_london#ba_s=sgr_1');

  await page.waitForSelector('button[data-testid="service-button"]');
  const button = await page.$('button[data-testid="service-button"]');
  await button.click();

})();

我想如果我能阅读页面,我可以提取显示的月份和日期,也许可以根据当前日期评估输出,并确定它是否在未来7天的时间范围内。如果在该时间范围内,则向我发送通知。
我所问的只是我如何才能真正评估弹出的内容,得到它的月份和/或日期作为输出。谢谢!

a0x5cqrl

a0x5cqrl1#

booking模型是在一个框架中,所以你可以使用.contentFrame()来访问它,并像页面对象一样调用它的方法:

const puppeteer = require("puppeteer"); // ^19.7.5

const url = "<Your URL>";

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  await page.goto(url, {waitUntil: "domcontentloaded"});
  const btn = await page.waitForSelector(
    'button[data-testid="service-button"]'
  );
  await btn.click();
  const frameEl = await page.waitForSelector(
    '[data-testid="booking-widget"]'
  );
  const frame = await frameEl.contentFrame();
  await frame.waitForSelector(".chip div");
  const dates = await frame.$$eval(".chip", els =>
    Object.fromEntries(
      els
        .map(e =>
          [...e.querySelectorAll("div")].map(e => e.textContent)
        )
        .filter(Boolean)
    )
  );
  console.log(dates);
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

我不完全确定你想要什么数据,但这给了你一周的日期。我希望你能从这里开始。
几点提示:

  • waitForSelector之后,通常不必重新选择,它返回找到的元素。
  • 在你让脚本工作之后,考虑阻塞那些对你需要的数据来说不必要的资源。这是一个很慢的页面。
  • 您想要的数据可能在您可以拦截的网络响应中,从而避免了处理帧,但是如果您想对该模态采取行动,那么无论如何,上面显示的DOM方法都值得一看。

相关问题