Python:如何在pyppeteer中保持浏览器打开并创建CDPSession

6

我有两个问题目前无法解决。

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个回答

7

如何保持浏览器运行

您只需要使用autoClose标志,这里是文档:

autoClose(布尔值):在脚本完成时自动关闭浏览器进程。默认为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())

pyppeteer本身的Browser.createIncognitoBrowserContext启发。 请注意,通过CDP创建其他会话似乎并不是一个好主意,因为browser._contexts不会被更新,并且会变得不一致。同时,Browser.createIncognitoBrowserContext可能会完全满足您的需求,而无需诉诸CDP。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接