Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How To Run Selenium With Chrome In Docker

I installed google-chrome in a Docker, but when I run my Python 2 script of Selenium, it failed like this:

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) 

And if I run google-chrome directly in docker, it shows below:

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$ 

System:

$ 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) 
like image 918
J. Fan Avatar asked Jul 26 '17 09:07

J. Fan


People also ask

Can you run Chrome in docker?

Without the display variable we can't run GUI apps inside a container. Now chrome runs inside the container, as we had mentioned DISPLAY variable while launching this container!

How do I run a test in a docker container?

Running tests against a browser in a Docker container through an Open Agent that is running in another Docker container. The browser and the Open Agent communicate with each other through a Docker network. The test executor is running on your local Windows machine. Running tests entirely from Docker containers.


2 Answers

You need to launch a standalone chrome browser

docker run -d -p 4444:4444 selenium/standalone-chrome 

and then in your python script launch browser using Remote webdriver

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) 

If you want you can also launch a Selenium Grid hub.

To do this as a django test do the following:

# docker-compse.yml  selenium:   image: selenium/standalone-firefox   ports:   - 4444:4444  # project/app/test.py  from django.test import TestCase from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities   class SiteTest(TestCase):     fixtures = [         'app/fixtures/app.json',         ...     ]      def setUp(self):         self.browser = webdriver.Remote("http://selenium:4444/wd/hub", DesiredCapabilities.FIREFOX)      def tearDown(self):         self.browser.quit()      def test_visit_site(self):         self.browser.get('http://app:8000/')         self.assertIn(self.browser.title, 'Home') 

Note:

If you use webdriver.ChromeOptions|FirefoxOptions|etc then DesiredCapabalities import is not necessary:

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless')  # example driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub", options=options) 
like image 103
Tarun Lalwani Avatar answered Sep 24 '22 17:09

Tarun Lalwani


You need to add the next lines to your 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 

Then your code should be like this. Especially you need to declare your driver like below:

from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--window-size=1920,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() 
like image 35
Mehmet nuri Avatar answered Sep 24 '22 17:09

Mehmet nuri