Python: держать открытый браузер в pyppeteer и создавать CDPSession
У меня есть две проблемы, которые я не могу решить в данный момент.
1. Я хотел бы, чтобы браузер работал, чтобы я мог просто повторно подключиться с помощью pyppeteer.launcher.connect()
функция, но, кажется, закрыта сразу же, даже если я не звоню pyppeteer.browser.Browser.close()
,
test01.py:
import asyncio
from pyppeteer import launch, connect
async def fetch():
browser = await launch(
headless=False,
args=['--no-sandbox']
)
print(f'Endpoint: {browser.wsEndpoint}')
await browser.disconnect()
loop = asyncio.get_event_loop()
loop.run_until_complete(fetch())
$ python test01.py
Endpoint: ws://127.0.0.1:51757/devtools/browser/00e917a9-c031-499a-a8ee-ca4090ebd3fe
$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://127.0.0.1:51757
curl: (7) Failed to connect to 127.0.0.1 port 51757: Connection refused
2. Как мне создать сеанс CDP. Этот код должен открыть другое окно браузера, но он не работает должным образом:
test02.py
import asyncio
import time
from pyppeteer import launch, connect
async def fetch():
browser = await launch(
headless=False,
args=['--no-sandbox']
)
page = await browser.newPage()
cdp = await page.target.createCDPSession()
await cdp.send('Target.createBrowserContext')
time.sleep(5)
await browser.disconnect()
loop = asyncio.get_event_loop()
loop.run_until_complete(fetch())
$ python test02.py
Future exception was never retrieved
future: <Future finished exception=NetworkError('Protocol error Target.sendMessageToTarget: Target closed.',)>
pyppeteer.errors.NetworkError: Protocol error Target.sendMessageToTarget: Target closed.
1 ответ
Как поддерживать работу браузера
Вам просто нужно использовать autoClose
флаг, вот документы:
autoClose (bool): автоматически закрывать процесс браузера после завершения скрипта. По умолчанию установлено значение True.
В этом случае ваш test01.py будет выглядеть следующим образом:
import asyncio
from pyppeteer import launch, connect
async def fetch():
browser = await launch(
headless=False,
args=['--no-sandbox'],
autoClose=False
)
print(f'Endpoint: {browser.wsEndpoint}')
await browser.disconnect()
loop = asyncio.get_event_loop()
loop.run_until_complete(fetch())
Сессия CDP
Вот:
import asyncio
import time
from pprint import pprint
from pyppeteer import launch, connect
from pyppeteer.browser import BrowserContext
async def fetch():
browser = await launch(
headless=False,
args=['--no-sandbox'],
autoClose=False
)
page = await browser.newPage()
cdp = await page.target.createCDPSession()
raw_context = await cdp.send('Target.createBrowserContext')
pprint(raw_context)
context = BrowserContext(browser, raw_context['browserContextId'])
new_page = await context.newPage()
await cdp.detach()
await browser.disconnect()
loop = asyncio.get_event_loop()
loop.run_until_complete(fetch())
Вдохновлен Browser.createIncognitoBrowserContext от pyppeteer
сам. Заметьте, что создание дополнительных сеансов через CDP не кажется такой хорошей идеей, потому что browser._contexts
не будет обновляться и станет противоречивым. Также вероятно, что Browser.createIncognitoBrowserContext
может соответствовать вашим потребностям, не прибегая к CDP вообще