Docker 无法启动新会话。可能的原因是远程服务器地址无效或浏览器启动失败

Docker Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure

提问人:user16187251 提问时间:11/16/2023 更新时间:11/18/2023 访问量:75

问:

我的Chrome浏览器版本是119.0.6045.160。我的 chrome 驱动程序版本是 119.0.6045.105。 我的 Selenium java 版本是 4.8.3。

我正在用硒做网络报废。它在springboot中运行没有错误。我还设置了二进制路径。

 ChromeOptions options = new ChromeOptions();
 options.setBinary("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");


 WebDriver driver = new ChromeDriver(options);

但是,当我运行它的 docker 映像时,我收到错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
Caused by: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
Host info: host: 'dd7e0e343e76', ip: '172.17.0.2'
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:561)
        at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:229)
        at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:157)
        at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:101)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:88)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:84)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:73)
        at com.linggd.demo.Duldung2.myrun(Duldung2.java:64)
        at com.linggd.demo.Htmltest3Application.main(Htmltest3Application.java:85)
        ... 8 more
Caused by: org.openqa.selenium.WebDriverException: Timed out waiting for driver process to start.
Build info: version: '4.8.3', revision: 'e5e76298c3'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.16.3-microsoft-standard-WSL2', java.version: '17.0.9'
Driver info: driver.version: ChromeDriver
        at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:208)
        at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:114)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543)
        ... 16 more

我认为 docker 中的 chrome 二进制文件可能与我的 chrome 驱动程序存在一些兼容性问题,所以我在 Dockerfile 中指定了 chrome 版本 119.0.6045.159-1,但错误仍然存在。 这是我的 Dockerfile:

 FROM debian:bullseye-slim

WORKDIR /app

EXPOSE 8081

# Install required dependencies
RUN apt-get update && apt-get install -y openjdk-17-jre-headless libnss3 libxcb1

RUN apt-get install -y wget libgdk-pixbuf2.0-0 libnss3 libatk-bridge2.0-0 libcups2 libdrm2 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libxkbcommon-x11-0 libpangocairo-1.0-0 libasound2


ENV CHROME_VERSION "119.0.6045.159-1"

RUN set -ex && \
  apt-get update -qqy && \
  wget --no-check-certificate https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb && \
  apt-get install -qqyf ./google-chrome-stable_${CHROME_VERSION}_amd64.deb && \
  rm google-chrome-stable_${CHROME_VERSION}_amd64.deb


COPY target/springboot-aws-exe.jar /app/
COPY chromedriver.exe /app/chromedriver 

ENTRYPOINT ["java", "-jar", "/app/springboot-aws-exe.jar"]

我做错了什么?任何帮助都是值得赞赏的。

java docker google-chrome selenium-webdriver

评论


答:

1赞 0x00 11/16/2023 #1

问题可能是您使用的映像是 Linux 发行版 (Debian),而您复制到容器的驱动程序似乎是 Windows 的 chrome 驱动程序 () 您需要下载适用于 Linux 的 chrome 驱动程序 (linux64)chromedriver.exe

此外,请确保您的 java 程序指向容器内二进制文件的正确路径。正如您在代码中所示,它当前指向 Windows 计算机内部的路径。

评论

0赞 user16187251 11/16/2023
感谢您提供的信息,对于二进制文件,您的意思是我应该下载 chrome 浏览器二进制文件并在代码中设置路径以指向它吗?
0赞 0x00 11/17/2023
options.setBinary("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");指向主机系统中的 Windows 二进制文件。但是这个二进制文件不会存在于容器中,所以硒不会找到它。即使你把它放在容器里,它也不会工作,因为你正在运行一个 Linux 容器。我不知道 selenium 是否可以只使用 PATH 中的内容,但您需要将其指向容器内的 Chrome。
0赞 user16187251 11/17/2023
我已将其更改为 chrome 二进制文件在容器中的位置,但我仍然收到相同的错误。options.setBinary("/usr/bin/google-chrome");
0赞 0x00 11/17/2023
怎么样?您是否将其更改为 linux64 chrome 驱动程序?COPY chromedriver.exe /app/chromedriver
0赞 user16187251 11/18/2023
是的,我尝试将与我的 dockerfile 目录相同的 linux chrome 驱动程序直接复制到容器中,但它不起作用。COPY chromedriver /app/