连接pyppeteer到现有的chrome浏览器。

7
我想使用pyppeteer连接到已经打开的Chrome浏览器(用户已经打开,没有使用额外标志),以便我可以对其进行控制。
我几乎可以在之前执行所有手动操作(例如,在现有Chrome中启用远程调试模式),但最好能够只进行最少的操作。
为了使用browser.connect,我需要提供browserWSEndpoint, 也就是'http://localhost:9222/json/version'下等效于webSocketDebuggerUrl
我的问题是,只有当我运行带有--headless标记的chrome时,我才能访问'http://localhost:9222/json/version',否则我无法获取此字符串。
我尝试从cmd运行: chrome --disable-gpu --remote-debugging-port=9222 https://stackoverflow.com 这会在已打开的Chrome实例下打开一个新选项卡,但我仍然无法访问'http://localhost:9222/json/version'来获取webSocketDebuggerUrl(尝试访问该地址时我会收到'ERR_CONNECTION_REFUSED')。
我该怎么做?我在网上找不到任何信息。
编辑(还细化了问题的第一段):
感谢所有答案,但似乎我最初想要做的事情是不可能的。如果没有使用--remote-debugging-port=XXXX标志,您无法连接到已经打开的Chrome浏览器(第一个浏览器实例)。一旦打开了浏览器的第一个实例,它就会锁定浏览器的用户数据,并且无法从命令行向浏览器添加标志(仅由用户在浏览器内部添加)。
3个回答

2
webSocketDebuggerUrl 值属于每个单独的选项卡。
需要从已经打开的实例中删除此方法,需要使用 --remote-debugging-port=9222 完全启动新实例。
在启动 Chrome 之前尝试运行以下命令:
taskkill /F /IM chrome.exe
现在你想要的 URL 是 http://127.0.0.1:9222/json,并且看起来像这样:
screenshotof :9222/json
如果这解决了问题,那太好了,但我认为你实际想做的是启动包含个人数据的本机 Chrome 并使该实例接受来自脚本的命令。
幸运的是,这是一个更简单的目标!
您可以通过传递 executablePath 和 userDataDir 来实现。
from pyppeteer import launch
import asyncio

url = 'https://dev59.com/Z7bna4cB1Zd3GeqPZViz'

async def main():
    global browser
    browser = await launch(headless=False, executablePath='C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', userDataDir="\\Local\\Google\\Chrome\\User Data")
    page = await browser.newPage()
    await page.goto(url)
    # await browser.close()

 run = asyncio.run(main())

这种方法存在一个问题,如果在创建一个chrome实例时已经有其他chrome实例在运行,则无法打开新页面。
我建议设置一个单独的Chrome安装程序,您可以按照自己的意愿进行设置,并使用pyppeteer进行控制。
如果我发现这种方法还有其他错误,我会进行更新。

您可以编写一个脚本,在以这种方式启动Chrome时从正常Chrome更新用户数据。


这种方法的一个问题是,如果在创建一个新的Chrome实例时有其他现有的Chrome实例正在运行,那么您将无法打开一个新页面。这就是我的问题所在。这就是为什么我尝试连接到现有的Chrome实例。我猜这是不可能的。 - Noam
这并非不可能,但确实是一个比较棘手的问题。你尝试过从主要的Node.js版本的Puppeteer中进行吗?我会调查一下并很快回复。 - John Edens
我已经有了一些进展,过一两天我会回复。 - John Edens
怎么样了? - CS QGB

1
连接pyppeteer到现有的Chrome浏览器
b=await pyppeteer.connect(browserURL='http://127.0.0.1:9222')
pages = await b.pages()
page=pages[-1]


print(await page.evaluate(""" navigator.webdriver  """) )

0

我不知道为什么它对你不起作用,但是我可以连接到现有的 Chrome 实例,即使我使用 chrome --headless --remote-debugging-port=9222 --disable-gpu 命令启动它。

import asyncio
import aiohttp
import pyppeteer

loop = asyncio.get_event_loop()


async def main():
    async with aiohttp.ClientSession() as session:

        try:
            async with session.get("http://localhost:9222/json/version") as response:
                chrome = await response.json()
                browser = await pyppeteer.launcher.connect(
                    loop=loop,
                    browserWSEndpoint=chrome['webSocketDebuggerUrl']
                )
        except aiohttp.ClientConnectorError:
            print("start chrome --headless --remote-debugging-port=9222 --disable-gpu")
            return

    [page, *_] = await browser.pages()
    await page.goto('https://stackoverflow.com')
    await browser.close()


loop.run_until_complete(main())

谢谢你的回答,但是看起来我最初想要做的事情不可能实现。如果Chrome没有使用--remote-debugging-port=XXXX标志打开,那么你就不能连接到已有的Chrome来进行远程控制。 - Noam
@Noam 你无法连接到一个未启动为可远程控制的 Chrome 实例。那就是它的目的。 - Sinan Cetinkaya

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