为什么Selenium ChromeDriver在远程服务器上运行时抛出"Connection aborted." / "RemoteDisconnected"错误,而不是在本地?



TL;DR:

Selenium正在抛出此错误

urllib3.exceptions.ProtocolError:("连接中止。",RemoteDisconnected("远程结束关闭连接,无响应")

在远程服务器上,但它在本地Docker实例上完美运行。


我在Docker中运行了Selenium/ChromeDriver,它在本地运行得很好,但每当我在远程服务器上运行同一个容器时,我都会遇到协议错误(在本例中为AWS Batch)。

我对Docker的理解是,它在自己的环境中运行,所以如果它在本地工作,就应该远程工作。我已经删除了我笔记本电脑上现有的Chrome驱动程序(包括卸载Chrome),以再次检查它是否使用了本地不在远程实例上的可用程序,但这并没有改变任何事情。

高级材料:

  • 硒版本:v4
  • ChromeDriver版本(它一直使用最新版本,但截至目前):102.05.5005.61
  • Python版本:3.9
  • 远程机器-带有公共IP的AWS Fargate实例(如果需要,可以提供更多详细信息)

注意:根据这个SO答案,我知道问题是ChromeDriver和Chrome浏览器之间不兼容,但我不明白为什么本地与远程会发生变化!!

要复制的问题代码:

Dockerfile

FROM python:3.9
# set a directory for the app
WORKDIR /app
RUN apt-get update 
RUN apt-get install -y wget xvfb unzip
# Set up the Chrome PPA
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
# Set up Chromedriver Environment variables
ENV CHROMEDRIVER_DIR ./chromedriver
RUN mkdir $CHROMEDRIVER_DIR
RUN wget -O ./chromedriver/LATEST_RELEASE http://chromedriver.storage.googleapis.com/LATEST_RELEASE
# # Update the package list and install chrome
RUN apt-get update -y
RUN apt-get install -y google-chrome-stable=$(cat ./chromedriver/LATEST_RELEASE)-1
# # Download and install Chromedriver
RUN wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$(cat ./chromedriver/LATEST_RELEASE)/chromedriver_linux64.zip"
RUN unzip $CHROMEDRIVER_DIR/chromedriver* -d $CHROMEDRIVER_DIR
# Put Chromedriver into the PATH
ENV PATH $CHROMEDRIVER_DIR:$PATH

RUN pip install --no-cache-dir pipenv
COPY Pipfile .
COPY Pipfile.lock .
RUN pipenv install --dev
COPY . .
CMD ["pipenv", "run", "main"]

简化的python文件:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def create_web_driver():
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("window-size=1400,2100")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--version")
driver = webdriver.Chrome(
# The driver location is inferred from the PATH variable
options=chrome_options,
)
return driver
if __name__ == "__main__":
driver = create_web_driver()
# Error occurs on this line
web_driver.get(url)

我在AWS中遇到的错误,但不是本地的:

Traceback (most recent call last):
File "/app/main.py", line 18, in <module>
web_driver.get(url)
... (truncated for brevity)
File "/usr/local/lib/python3.9/http/client.py", line 289, in _read_status
raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

我已经尝试修复这个错误4天了,如果有任何建议或以前的经验,我们将不胜感激!

我一发布问题就找到了修复方法,我所要做的就是更改:chrome_options.add_argument("--disable-gpu")

到此:
chrome_options.add_argument("--disable-dev-shm-usage")

一切都很完美!

相关内容

  • 没有找到相关文章

最新更新