События создания и закрытия страниц

Puppeteer является мощным инструментом для автоматизации браузера Chrome, и одним из его ключевых аспектов является работа с событиями. В этой главе рассмотрим обработку событий, связанных с созданием и закрытием страниц.

Событие создания страницы

При взаимодействии с браузером, Puppeteer предоставляет несколько методов для работы с страницами. Каждая новая страница, открытая в браузере, генерирует событие targetcreated, которое можно использовать для отслеживания создания новых страниц.

Чтобы обработать это событие, нужно подписаться на него, используя метод page.on() или browser.on():

const puppeteer = require(&

(async () => {
  const browser = await puppeteer.launch();
  browser.on('targetcreated', target => {
    if (target.type() === 'page') {
      console.log(`Страница создана: ${target.url()}`);
    }
  });
  
  const page = await browser.newPage();
  await page.goto('https://example.com');
  
  await browser.close();
})();

В этом примере событие targetcreated срабатывает каждый раз, когда в браузере появляется новая целевая страница (target). Важно отметить, что target может быть как страницей, так и другими типами, такими как воркеры или расширения. Поэтому стоит проверять тип с помощью target.type().

Метод browser.on(‘targetcreated’, …) будет ловить все события создания новых страниц, независимо от того, через какой объект был открыт новый таб. В случае если нужно отследить только страницы, можно добавить фильтрацию по типу цели.

Открытие новой страницы через Puppeteer

Когда используется метод browser.newPage(), он создает новую страницу в браузере и возвращает объект Page. Ожидаемое поведение — страница будет автоматически доступна для дальнейших операций.

const page = await browser.newPage();

Этот метод сам по себе не генерирует событие. Однако если вы хотите отследить момент создания страницы в вашем коде, то использовать событие targetcreated — оптимальный вариант.

Событие закрытия страницы

При закрытии страницы в Puppeteer срабатывает событие close. Это событие можно отследить как для отдельных страниц, так и для всего браузера.

Чтобы отследить событие закрытия конкретной страницы, можно использовать метод page.on(‘close’, callback). В случае, если нужно отслеживать закрытие любой страницы в браузере, можно использовать аналогичное событие для объекта browser.

Пример для отслеживания закрытия страницы:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  
  page.on('close', () => {
    console.log('Страница была закрыта');
  });
  
  await page.goto('https://example.com');
  await page.close();
  
  await browser.close();
})();

В этом примере мы подписываемся на событие close для страницы, и как только страница закрывается, срабатывает callback-функция. Аналогично можно отслеживать события закрытия для всего браузера.

Отслеживание событий на уровне браузера

События создания и закрытия страниц также можно отслеживать на уровне самого браузера. Это полезно, если нужно, например, логировать все открытия и закрытия страниц в рамках одного браузерного сеанса.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  
  browser.on('targetcreated', target => {
    if (target.type() === 'page') {
      console.log(`Создана новая страница: ${target.url()}`);
    }
  });
  
  browser.on('targetdestroyed', target => {
    if (target.type() === 'page') {
      console.log(`Закрыта страница: ${target.url()}`);
    }
  });

  const page1 = await browser.newPage();
  await page1.goto('https://example.com');
  await page1.close();
  
  const page2 = await browser.newPage();
  await page2.goto('https://example.org');
  
  await browser.close();
})();

Здесь событие targetcreated ловит создание страниц, а targetdestroyed — их закрытие. Этот подход позволяет отслеживать жизненный цикл всех страниц в браузере, не привязываясь к каждому объекту page отдельно.

Обработка событий при старте браузера

Кроме событий, связанных с конкретными страницами, можно отследить и глобальные события браузера. При запуске браузера можно подписаться на события, такие как targetcreated и targetdestroyed, для получения информации о том, какие страницы были открыты или закрыты с самого начала.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  
  browser.on('targetcreated', target => {
    if (target.type() === 'page') {
      console.log(`Открыта новая страница: ${target.url()}`);
    }
  });

  browser.on('targetdestroyed', target => {
    if (target.type() === 'page') {
      console.log(`Закрыта страница: ${target.url()}`);
    }
  });

  await browser.newPage();
  await browser.newPage();
  await browser.close();
})();

В этом примере события отрабатывают для каждой страницы, как только она была создана или закрыта. Это позволяет контролировать и вести логи для всей сессии браузера.

Проблемы и особенности

При работе с событиями создания и закрытия страниц важно учитывать следующие моменты:

  • Асинхронность: Работа с Puppeteer и его API предполагает асинхронность. Это означает, что подписка на события, такие как создание или закрытие страниц, должна быть реализована в правильном порядке, чтобы не пропустить важные события.

  • Закрытие браузера: Если браузер закрывается с помощью метода browser.close(), все страницы также будут закрыты. Это приведет к срабатыванию события close для каждой из них, что стоит учитывать при логировании или других операциях.

  • Обработка ошибок: В процессе работы с событиями может возникать множество ошибок, таких как проблемы с загрузкой страницы или с взаимодействием с объектами. Лучше всего реализовывать обработку ошибок, чтобы гарантировать стабильность тестов или скриптов.

Использование с тестовыми фреймворками

Поскольку Puppeteer активно используется в тестировании, часто необходимо отслеживать создание и закрытие страниц в рамках тестов. В таких случаях важно интегрировать обработку этих событий с фреймворками, такими как Mocha или Jest. Это позволяет лучше контролировать жизнь теста, а также собирать дополнительные логи для отладки.

Пример использования с Mocha:

const puppeteer = require('puppeteer');
const assert = require('assert');

describe('Puppeteer Page Events', function() {
  let browser;
  
  before(async () => {
    browser = await puppeteer.launch();
  });
  
  it('Создание страницы', async () => {
    const page = await browser.newPage();
    const url = page.url();
    assert.strictEqual(url, 'about:blank');
    await page.close();
  });

  it('Закрытие страницы', async () => {
    const page = await browser.newPage();
    await page.goto('https://example.com');
    await page.close();
  });

  after(async () => {
    await browser.close();
  });
});

В данном примере тесты проверяют, как страницы создаются и закрываются. События обработки создания и закрытия страниц позволяют отследить, когда и как происходят эти действия, что важно для тестирования и отладки автоматических тестов.

Заключение

Понимание событий создания и закрытия страниц в Puppeteer является неотъемлемой частью работы с браузером, так как это позволяет создавать гибкие и масштабируемые решения для автоматизации. Подписка на события targetcreated, targetdestroyed, и close позволяет эффективно отслеживать жизненный цикл страниц, что особенно важно для написания стабильных тестов и взаимодействия с веб-приложениями.