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)
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!
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.
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)
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With