环境
使用docker+chrome_driver进行自动化截图
异常信息
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.openqa.selenium.WebDriverException: unknown error: session deleted because of page crash
from unknown error: cannot determine loading status
from tab crashed
(Session info: chrome-headless-shell=122.0.6261.94)
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'fc932151e48c', ip: '11.0.0.34', os.name: 'Linux', os.arch: 'amd64', os.version: '3.10.0-862.el7.x86_64', java.version: '1.8.0_312'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome-headless-shell, browserVersion: 122.0.6261.94, chrome: {chromedriverVersion: 122.0.6261.94 (880dbf29479c..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:33196}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: fe3094fcdb359a9daa2a8e75f50e4e1e
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:584)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:791)
at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:228)
at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
解决方案
在github上看到说是因为docker容器内的 /dev/shm 内存过小导致的page crash
解决措施:
-
启动chomedriver时增加参数:
--disable-dev-shm-usage12
:option.addArguments(“–disable-dev-shm-usage”)
我是通过该种方式解决的问题
该参数解释解释:
--disable-dev-shm-usage
参数用于禁用Chrome浏览器中的/dev/shm
内存临时文件系统的使用。在默认情况下,Chrome浏览器会将其临时文件存储在/dev/shm
目录下,这个目录通常是挂载在内存中的,而不是磁盘上。这样做的目的是为了提高性能,因为内存读写速度通常比硬盘读写速度快得多。然而,在某些情况下,
/dev/shm
的内存大小可能会有限,导致Chrome运行过程中占用的内存过多,从而导致Chrome进程被系统强制终止。为了解决这个问题,可以使用--disable-dev-shm-usage
参数来禁用Chrome浏览器使用/dev/shm
目录,而是使用基于磁盘的临时文件存储。这样可以确保Chrome进程占用的内存不会超出系统限制,从而提高稳定性。 -
修改 /dev/shm的大小
1、以特权模式启动:docker run --privileged
2、修复 /dev/shm 大小过小的问题
docker exec $id sudo umount /dev/shm
docker exec $id sudo mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=512M tmpfs /dev/shm
参考资料:
https://github.com/elgalu/docker-selenium/issues/20
https://stackoverflow.com/questions/53902507/unknown-error-session-deleted-because-of-page-crash-from-unknown-error-cannot