J'ai installé google-chrome dans un Docker , mais quand j'exécute mon script Python 2 de Selenium , il a échoué comme ceci:
automation@1c17781fef0c:/topology-editor/test$ python test.py
Traceback (most recent call last):
File "test.py", line 27, in <module>
browser = webdriver.Chrome()
File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/chrome/webdriver.py", line 69, in __init__
desired_capabilities=desired_capabilities)
File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/remote/webdriver.py", line 98, in __init__
self.start_session(desired_capabilities, browser_profile)
File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/remote/webdriver.py", line 185, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/remote/webdriver.py", line 249, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/Selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
Selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Linux 4.4.0-83-generic x86_64)
Et si je lance Google Chrome directement dans Docker, cela apparaît ci-dessous:
automation@1c17781fef0c:/topology-editor/test$ google-chrome
Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted
Trace/breakpoint trap (core dumped)
automation@1c17781fef0c:/topology-editor/test$
Système:
$ uname -a
Linux 1c17781fef0c 4.4.0-83-generic #106-Ubuntu SMP Mon Jun 26 17:54:43 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ google-chrome --version
Google Chrome 60.0.3112.78
$ chromedriver --version
ChromeDriver 2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8)
Vous devez lancer un navigateur autonome chrome navigateur
docker run -d -p 4444:4444 Selenium/standalone-chrome
puis dans votre navigateur de lancement de script python en utilisant un pilote Web à distance
from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub", DesiredCapabilities.CHROME)
Si vous le souhaitez, vous pouvez également lancer un hub Selenium Grid
La meilleure façon d'utiliser le sélénium dans un conteneur docker vous devez suivre les étapes suivantes.
Votre besoin d'ajouter les lignes suivantes à votre Dockerfile
# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [Arch=AMD64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable
# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.Zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.Zip
RUN unzip /tmp/chromedriver.Zip chromedriver -d /usr/local/bin/
# set display port to avoid crash
ENV DISPLAY=:99
# install Selenium
RUN pip install Selenium==3.8.0
Ensuite, votre code devrait être comme ça. En particulier, vous devez déclarer votre pilote comme ci-dessous:
from Selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--window-size=1420,1080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('www.google.com')
screenshot = driver.save_screenshot('test.png')
driver.quit()
Je suppose que vous devez l'exécuter en mode sans tête
https://developers.google.com/web/updates/2017/04/headless-chrome
c'est comme ça que je le fais en Ruby
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: {args: %w[ no-sandbox headless disable-gpu window-size=1280,1000 ]})
Capybara::Selenium::Driver.new(app, :browser => :chrome, http_client: client, desired_capabilities: capabilities)
Vous pouvez à peu près adapter votre code en python
envisagez également d'installer des bibliothèques de polices qui chrome doit fonctionner sans tête
RUN apt-get update && \
apt-get -qq -y install libxpm4 libxrender1 libgtk2.0-0 libnss3\
libgconf-2-4 libpango1.0-0 libxss1 libxtst6 fonts-liberation\
libappindicator1 xdg-utils
RUN apt-get -y install \
xvfb gtk2-engines-pixbuf \
xfonts-cyrillic xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable \
imagemagick x11-apps Zip