fanyong920 / jvppeteer

Headless Chrome For Java (Java 爬虫)
Apache License 2.0
730 stars 158 forks source link

多次打开chrome再关闭会卡在:Connect to browser by websocket url #165

Open beilyly opened 4 days ago

beilyly commented 4 days ago

Websocket serverHandshake status: 101 [2024-11-19 22:54:03.151]Connect to browser by websocket url: ws://127.0.0.1:45871/devtools/browser/45db7d52-a4b2-4a8 e-98b0-1699109d38c8

系统:centos8.5 版本:2.2.1 chrome testing的版本:128.0.6613.137 和 131.0.6778.69 问题: 卡在上面这里,Connect to browser by websocket不会继续向下执行。 场景:大概打开chrome,运行业务代码, 然后在关闭chrome,这个过程执行大概十几次左右, 就会出现问题。然后每次都要重启程序来解决问题。 老版本没有问题(1.1.5) , 升级新版本后, 出现的问题。

排查: 1.已经排查出现问题的时候没有chrome 或者chromium的进程。调用正常关闭chrome的方法外,还会查找进程, 再kill一遍。 2.每次结束后都删除user data目录

beilyly commented 4 days ago

下面是代码:

//设置基本的启动配置,这里选择了‘有头’模式启动 ArrayList argList = new ArrayList<>();

    //自动下载,第一次下载后不会再下载

// String path =""; if (proxyConfig != null){ path = proxyConfig.getBroswerPath(); } String userDataDir = getUserDataDir(ktbAccountDTO, proxyConfig); argList.add("--headless"); argList.add("--no-sandbox"); argList.add("-–disable-gpu"); argList.add("--incognito"); argList.add("--user-data-dir="+userDataDir); LaunchOptions options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(false).withExecutablePath(path).build();

    Browser browser = Puppeteer.launch(options);

    Page page = browser.defaultBrowserContext().pages().get(0);
beilyly commented 4 days ago

另外,谢谢作者些的这个库,非常好用。非常感谢

fanyong920 commented 3 days ago

试试2.2.3,与2.2.3配合使用的是chrome for testing 130.0.6723.58。然后当出现停止运行时候,用jps,jstack等工具看看线程停在哪里了

fanyong920 commented 3 days ago
    argList.add("--headless");

是旧的 headless 模式 新的 headless 模式是:

    chromeArguments.add("--headless=new");
    chromeArguments.add("--hide-scrollbars");
    chromeArguments.add("--mute-audio");
beilyly commented 3 days ago

谢谢你的建议。正在尝试: 1.chromeArguments.add("--headless=new"); 2.跟换chrome for testing 130.0.6723.58 3.使用2.2.3 4.在broswer.close()后,5秒后,chrome依旧存在的时候才会kill掉, 继续删除user Data目录

有结果我会第一时间反馈, 谢谢

beilyly commented 3 days ago

现在是完整的日志了,还需要什么信息不?

我排查了很久排查不出来。 因为要在复杂的环境中才能测试, 我本地完全没法复现,每次运行出问题了,才可以看到。 要赶紧的重启服务, 不然影响服务。

谢谢你 Connect to browser by websocket url: ws://127.0.0.1:42179/devtools/browser/3c844b39-0ca1-4479-bdf4-74bcedcfb2f3 Websocket serverHandshake status: WebSocket Protocol Handshake get browser pid error: com.ruiyun.jvppeteer.exception.TimeoutException: Timeout waiting for response for SystemInfo.getProcessInfo at com.ruiyun.jvppeteer.transport.Callback.waitForResponse(Callback.java:53) at com.ruiyun.jvppeteer.transport.CallbackRegistry.create(CallbackRegistry.java:34) at com.ruiyun.jvppeteer.transport.Connection.rawSend(Connection.java:183) at com.ruiyun.jvppeteer.transport.Connection.send(Connection.java:165) at com.ruiyun.jvppeteer.launch.BrowserLauncher.getBrowserPid(BrowserLauncher.java:160) at com.ruiyun.jvppeteer.launch.BrowserLauncher.run(BrowserLauncher.java:145) at com.ruiyun.jvppeteer.launch.ChromeLauncher.launch(ChromeLauncher.java:59) at com.ruiyun.jvppeteer.core.Puppeteer.rawLaunch(Puppeteer.java:83) at com.ruiyun.jvppeteer.core.Puppeteer.launch(Puppeteer.java:62)

fanyong920 commented 3 days ago

好的,不用其他信息了

beilyly commented 3 days ago

另外提供其他可能有用的信息: (1) 1.1.5版本配上老的浏览器,没有问题。 (2) 1.1.5版本配上最新的chrome, 一样会出现这个问题。 (3) 2.2.1-2.2.3版本,配上对应的chrome 128.0.6613.137 和 131.0.6778.69 ,130.0.6723.58, 一样会出现这个问题

fanyong920 commented 3 days ago

明天搞它,看起来不难,争取明天完成

fanyong920 commented 3 days ago

launchoptions的procotoltimeout属性设置短一点,现在默认是180秒,可以解决长时间等待。明天我再修改一下逻辑

beilyly commented 3 days ago

感觉应该不是这里的问题。 理由是:当这个问题发生, 它超时后抛出异常。无论几次重试调用这个方法,启动浏览器,依旧再等待中。并且进程中也没有chrome的进程了。只有重启服务才能解决问题。

fanyong920 commented 2 days ago

程序后面有打印websocket关闭的日志信息吗

beilyly commented 2 days ago

没有打印。就报错get browser pid error: com.ruiyun.jvppeteer.exception.TimeoutException: Timeout waiting for response for SystemInfo.getProcessInfo

beilyly commented 2 days ago

另外,这是我启动chrome的参数, 你看下有没有异常

jenkins 42815 41809 3 10:12 pts/0 00:00:02 /home/abc/service/logs/.local-browser/chrome-linux/chrome --headless --no-sandbox -–disable-gpu --incognito --user-data-dir=/home/abc/service/logs/.local-browser/abc_123123123 --disable-background-networking --disable-background-timer-throttling --disable-breakpad --disable-browser-side-navigation --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=site-per-process --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --disable-translate --metrics-recording-only --no-first-run --safebrowsing-disable-auto-update --enable-automation --password-store=basic --use-mock-keychain --remote-debugging-port=0 --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl about:blank jenkins 42822 1 0 10:12 ? 00:00:00 /home/abc/service/logs/.local-browser/chrome-linux/chrome_crashpad_handler --monitor-self --monitor-self-annotation=ptype=crashpad-handler --database=/home/jenkins/.config/google-chrome-for-testing/Crash Reports --annotation=lsb-release=CentOS Linux 8 --annotation=plat=Linux --annotation=prod=Chrome_Linux --annotation=ver=130.0.6723.58 --initial-client-fd=5 --shared-client-connection jenkins 42825 1 0 10:12 ? 00:00:00 /home/abc/service/logs/.local-browser/chrome-linux/chrome_crashpad_handler --no-periodic-tasks --monitor-self-annotation=ptype=crashpad-handler --database=/home/jenkins/.config/google-chrome-for-testing/Crash Reports --annotation=lsb-release=CentOS Linux 8 --annotation=plat=Linux --annotation=prod=Chrome_Linux --annotation=ver=130.0.6723.58 --initial-client-fd=4 --shared-client-connection jenkins 42828 42815 0 10:12 pts/0 00:00:00 /home/abc/service/logs/.local-browser/chrome-linux/chrome --type=zygote --no-zygote-sandbox --no-sandbox --headless --string-annotations --crashpad-handler-pid=42822 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/home/abc/service/logs/.local-browser/abc_123123123 --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl jenkins 42829 42815 0 10:12 pts/0 00:00:00 /home/abc/service/logs/.local-browser/chrome-linux/chrome --type=zygote --no-sandbox --headless --string-annotations --crashpad-handler-pid=42822 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/home/abc/service/logs/.local-browser/abc_123123123 --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl jenkins 42852 42828 4 10:12 pts/0 00:00:03 /home/abc/service/logs/.local-browser/chrome-linux/chrome --type=gpu-process --no-sandbox --disable-dev-shm-usage --disable-breakpad --headless --ozone-platform=headless --use-angle=swiftshader-webgl --string-annotations --crashpad-handler-pid=42822 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/home/abc/service/logs/.local-browser/abc_123123123 --change-stack-guard-on-fork=enable --gpu-preferences=UAAAAAAAAAAgAAAEAAAAAAAAAAAAAAAAAABgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAA --shared-files --metrics-shmem-handle=4,i,12274935052775981939,4858341775636317708,262144 --field-trial-handle=3,i,12464819544590174394,8794339880643922783,262144 --disable-features=PaintHolding,site-per-process --variations-seed-version jenkins 42853 42815 1 10:12 pts/0 00:00:00 /home/abc/service/logs/.local-browser/chrome-linux/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=zh-CN --service-sandbox-type=network --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --string-annotations --crashpad-handler-pid=42822 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/home/abc/service/logs/.local-browser/abc_123123123 --change-stack-guard-on-fork=enable --shared-files=network_parent_dirs_pipe:100,v8_context_snapshot_data:101 --metrics-shmem-handle=4,i,2102674135231128043,18326647886180022107,524288 --field-trial-handle=3,i,12464819544590174394,8794339880643922783,262144 --disable-features=PaintHolding,site-per-process --variations-seed-version jenkins 42854 42829 0 10:12 pts/0 00:00:00 /home/abc/service/logs/.local-browser/chrome-linux/chrome --type=utility --utility-sub-type=storage.mojom.StorageService --lang=zh-CN --service-sandbox-type=utility --no-sandbox --disable-dev-shm-usage --use-angle=swiftshader-webgl --string-annotations --crashpad-handler-pid=42822 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/home/abc/service/logs/.local-browser/abc_123123123 --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --metrics-shmem-handle=4,i,4046607735319666115,975560203114595930,524288 --field-trial-handle=3,i,12464819544590174394,8794339880643922783,262144 --disable-features=PaintHolding,site-per-process --variations-seed-version

fanyong920 commented 2 days ago

从日志信息看,websocket已经连接上,在调用SystemInfo.getProcessInfo 之前,可以肯定的是,websocket 能发送消息到 chrome,所以我怀疑 SystemInfo.getProcessInfo 让 chrome 进程奔溃了

fanyong920 commented 2 days ago

argList.add("-–disable-gpu"); argList.add("-–disable-gpu"); argList.add("--headless"); 这三个参数不同,应该也能跑通业务吧。 headless通过 LaunchOptions设置好一点

beilyly commented 2 days ago

argList.add("-–disable-gpu"); argList.add("-–disable-gpu"); argList.add("--headless");

好的,我立马尝试

beilyly commented 2 days ago

从日志信息看,websocket已经连接上,在调用SystemInfo.getProcessInfo 之前,可以肯定的是,websocket 能发送消息到 chrome,所以我怀疑 SystemInfo.getProcessInfo 让 chrome 进程奔溃了

调用SystemInfo.getProcessInfo ,这个有什么作用, 需要禁用他吗。

fanyong920 commented 2 days ago

获取进程 pid,后面close browser时候 用来kill 进程的,我在2.2.4禁用它,再观察问题时候还在

beilyly commented 2 days ago

argList.add("-–disable-gpu"); argList.add("-–disable-gpu");

都是disable

argList.add("-–disable-gpu"); argList.add("-–disable-gpu"); argList.add("--headless");

好的,我立马尝试 之前添加了, 无头,添加了。 disable-gpu找不到地方添加。 options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(false).withExecutablePath(path).build();

beilyly commented 2 days ago

我在2.2.4禁用它,再观察问题时候还在

等你的2.2.4版本再测试是吗?

fanyong920 commented 2 days ago

是的,我已经发布了,就等同步到中心仓库了

fanyong920 commented 2 days ago

你看什么能通过maven 下载2.2.4就测试一下

fanyong920 commented 2 days ago

argList.add("-–disable-gpu"); argList.add("-–disable-gpu");

都是disable

argList.add("-–disable-gpu"); argList.add("-–disable-gpu"); argList.add("--headless");

好的,我立马尝试 之前添加了, 无头,添加了。 disable-gpu找不到地方添加。 options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(false).withExecutablePath(path).build(); disable-gpu在LaunchOptions没有,只能通过args参数添加。

beilyly commented 2 days ago

你看什么能通过maven 下载2.2.4就测试一下

有个疑问:1.1.5版本, 没有使用 SystemInfo.getProcessInfo 方法吧。 但是他配合chrome 128.0.6613.137 和 131.0.6778.69 ,130.0.6723.58, 这些高版本的浏览器也会出现一直等待中的问题。

配合Chromium 722234就没有问题。

fanyong920 commented 2 days ago

你看什么能通过maven 下载2.2.4就测试一下

有个疑问:1.1.5版本, 没有使用 SystemInfo.getProcessInfo 方法吧。 但是他配合chrome 128.0.6613.137 和 131.0.6778.69 ,130.0.6723.58, 这些高版本的浏览器也会出现一直等待中的问题。

配合Chromium 722234就没有问题。

没有使用,难道是 chrome for testing的问题?或许你可以使用高版本的chromium试一下,或许你的服务器配合chromium比较号

fanyong920 commented 2 days ago

args添加这个参数看看,--disable-component-update,之前作为默认参数的,后来在2.2.1之前删除了

beilyly commented 2 days ago

配合Chromium 722234就没有问题。

试过了,我各种组合都试过了。 (1) 1.1.5版本配上老的浏览器Chromium 722234,没有问题。 (2) 1.1.5版本配上最新的chrome 128.0.6613.137 和 131.0.6778.69 ,130.0.6723.58, 一样会出现这个问题。 (3) 2.2.1-2.2.3版本,配上对应的chrome 128.0.6613.137 和 131.0.6778.69 ,130.0.6723.58, 一样会出现这个问题

刚刚开始我也以为是浏览器的问题。后来我一想,1. chrome的进程一直都是关闭的, 每次都重新打开。 2.并且每次出现问题的时候, 只需要重启java应用就又可以调用chrome了。

所以我从怀疑方向调整到了程序中, 我有一种猜想, 是不是程序有些地方没有设置对, 或者有些链接池中的链接没有释放。

我猜测: chrome testing 升级了启动的协议,程序没有兼容好。理由是:每次出现问题只需要重启java应用。

fanyong920 commented 2 days ago

如果是资源占用问题,在服务器能排查出来。不过我觉得可能性不大

beilyly commented 2 days ago

如果是资源占用问题,在服务器能排查出来。不过我觉得可能性不大

重启下java应用就可以了。 由这个可以推断出什么问题呢。 很诡异的问题, 我关注下内存变化,有结论再来反馈

beilyly commented 2 days ago

正常启动chrome的时候,内存占用1G,使用完关闭后, 内存占用为:800M, 接下来,我会观察出现问题时的内存占用。以及出问题前内存占用多少

beilyly commented 2 days ago

另外,请教下, 在调用了这个方法:page.on(Page.PageEvent.Response, new Consumer() { @Override public void accept(Response response) {

           完成业务逻辑后要不要主动off,然后再close page,
           还是直接关闭page ,broswer,或者kill chrome就可以了
fanyong920 commented 2 days ago

不用主动off了,当page没有引用的时候,垃圾回收了,自然就没有监听了。直接close page或者 kill chrome

fanyong920 commented 2 days ago

明天再看

fanyong920 commented 2 days ago

你浏览器使用多久就关闭呢

beilyly commented 2 days ago

用完就关闭。 稍等会, 我正在核对日志。 你可以先忽略上面的日志,我先核对下

beilyly commented 2 days ago

不好意思, 刚刚是错误的情况, 核对完日志, 关闭时被小伙伴错误关闭的。我继续让他跑, 让他等待下次遇见错误的时候。

fanyong920 commented 2 days ago

好的

fanyong920 commented 2 days ago

如果您需要排查 Chrome 浏览器的相关问题,例如标签页长时间加载和出现错误消息,调试日志可助您一臂之力。 这些日志不会自动生成,您需要先开启日志记录功能。 注意:以下说明均假设 Chrome 浏览器安装在默认位置。 调试日志会以 chrome_debug.log 的文件形式存储在用户数据目录中。 每次 Chrome 重启时,该文件都会被覆盖。

beilyly commented 2 days ago

谢谢提醒

beilyly commented 1 day ago

今天一天都没有事, 继续观察, 昨天增加了2G的虚拟内存。

yong fan @.***> 于2024年11月21日周四 23:30写道:

如果您需要排查 Chrome 浏览器的相关问题,例如标签页长时间加载和出现错误消息,调试日志可助您一臂之力。 这些日志不会自动生成,您需要先开启日志记录功能。 注意:以下说明均假设 Chrome 浏览器安装在默认位置。 调试日志会以 chrome_debug.log 的文件形式存储在用户数据目录中。 每次 Chrome 重启时,该文件都会被覆盖。

— Reply to this email directly, view it on GitHub https://github.com/fanyong920/jvppeteer/issues/165#issuecomment-2491547264, or unsubscribe https://github.com/notifications/unsubscribe-auth/AU5DMJSHQVPDQEIPBEI4KF32BX4DBAVCNFSM6AAAAABSCR3NTWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDIOJRGU2DOMRWGQ . You are receiving this because you authored the thread.Message ID: @.***>

fanyong920 commented 1 day ago

好的