5

我想使用pyppeteer连接到现有的(已经由用户打开,没有任何额外标志)Chrome 浏览器,这样我就可以控制它。

我以前几乎可以做所有手动操作(例如,在现有的 chrome 中启用远程调试模式),但最好用最少的操作来完成。

为了使用browser.connect,我需要给它browserWSEndpoint,相当于webSocketDebuggerUrl'http://localhost:9222/json/version'下。

我的问题是只有当我运行带有--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”地址)。

我该怎么做?我在网上找不到任何东西。

编辑(也细化了问题的第一段):

感谢大家的回答,但似乎我最初想做的事情是不可能的。如果不是第一次打开现有的 Chrome (浏览器的第一个实例)并带有--remote-debugging-port=XXXX允许您远程控制它的标志,则您无法连接到它。一旦打开浏览器的第一个实例 - 它就会锁定浏览器的用户数据,并且不能从命令行将标志添加到浏览器(只能从浏览器本身内部,由用户)。

4

3 回答 3

1

webSocketDebuggerUrl值属于每个单独的选项卡。
此方法需要从您已经打开的实例中删除,该实例需要使用--remote-debugging-port=9222.

在启动 chrome 之前尝试运行它。

taskkill /F /IM chrome.exe

现在你想要的 url 是 http://127.0.0.1:9222/json 并且看起来像这样。
截图:9222/json

如果这解决了它,很好,但我认为你真正想要做的是启动包含你的个人数据的本机 chrome,并让该实例接受来自你的脚本的命令。

幸运的是,这是一个简单得多的目标!

您可以通过传递 executablePath 和 userDataDir 来启动

from pyppeteer import launch
import asyncio

url = 'https://stackoverflow.com/questions/57957890/connect-with-pyppeteer-to-existing-chrome'

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 安装,您可以设置您想要的方式,而不是使用 pyppeteer 进行控制。
如果我发现此方法的其他错误,我会更新。

每当您以这种方式启动它时,都可以有一个脚本来正确地从 Chrome 更新用户数据

于 2020-01-26T20:29:40.680 回答
0

用 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  """) )
于 2020-08-14T02:53:43.650 回答
0

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

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())
于 2020-12-06T15:35:30.300 回答