7

This is a pretty bizarre situation I have encountered. I have the following simple Python script:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options


options = Options()
options.add_argument("-headless")
browser = webdriver.Firefox(firefox_options=options)
browser.get("https://www.google.com")
print(browser.current_url)

And wrapper for the script:

#!/bin/bash

wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
tar -xzvf geckodriver-v0.19.1-linux64.tar.gz
chmod 777 geckodriver
mv geckodriver /usr/bin/
firefox -v
# python3 when ubuntu
python test.py 

Additionally I have two Dockerfiles:

Dockerfile A (Ubuntu; works fine):

FROM ubuntu:16.04
RUN apt-get update -y && apt-get install -y python3 \
        python3-pip \
        firefox \
        build-essential \
        wget
COPY . /app
WORKDIR /app
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
ENTRYPOINT ["bash"]
CMD ["test_wrapper.sh"]

Dockerfile B (Debian; crashes):

FROM continuumio/anaconda3:5.0.1
RUN apt-get update -y && apt-get install -y iceweasel \
        build-essential \
        wget
COPY . /app
WORKDIR /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ENTRYPOINT ["bash"]
CMD ["test_wrapper.sh"]

test.py run from the image built from Dockerfile B throws the following exception:

selenium.common.exceptions.WebDriverException: Message: Process unexpectedly closed with status: 1

The geckodriver.log shows the following error:

GTK_BACKEND doesn't match available displays

Has anyone encountered this and know a workaround? It shouldn't need access to a display because it's running headless - unless selenium Firefox options are different in iceweasel than regular Firefox? I expected similar behavior, and I would much prefer to use the Anaconda image

I just tried this which I was almost certain would solve it but it did not work.

EDIT: I do not believe this is a geckodriver issue as I tried the same Dockerfile with firefox-esr instead of iceweasel. Additionally, I tried starting the container interactively and executed firefox -headless (which on ubuntu launches a headless firefox session) it gave the same exact GTK error selenium does.

quantik
  • 776
  • 12
  • 26
  • 6
    The headless mode was introduced by version 55 on Linux and the current ESR version of Firefox is 52. I guess the `-headless` flag is ignored and Firefox is crashing due to the lack of display. Try with a more recent version: https://github.com/SeleniumHQ/docker-selenium/blob/master/NodeFirefox/Dockerfile – Florent B. Mar 03 '18 at 23:50
  • @FlorentB. this is a good idea I'll try it out – quantik Mar 05 '18 at 00:09
  • 4
    @FlorentB. This works! Sorta. There's a couple of modifications you need to make for Docker and Debian. You can't `apt-get install firefox` because there is no firefox package for Debian. Additionally you have to install `libgtk-3-dev`. This is automatically installed on `ubuntu:latest` but not `debian:8`. Make those alterations and I'll accept your answer. – quantik Mar 05 '18 at 00:41

2 Answers2

4
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y wget \
        build-essential \
        libgl1-mesa-glx \
        libgtk-3-dev 
ARG FIREFOX_VERSION=58.0.2
RUN wget --no-verbose -O /tmp/firefox.tar.bz2 https://download-installer.cdn.mozilla.net/pub/firefox/releases/$FIREFOX_VERSION/linux-x86_64/en-US/firefox-$FIREFOX_VERSION.tar.bz2 \
   && rm -rf /opt/firefox \
   && tar -C /opt -xjf /tmp/firefox.tar.bz2 \
   && rm /tmp/firefox.tar.bz2 \
   && mv /opt/firefox /opt/firefox-$FIREFOX_VERSION \
   && ln -fs /opt/firefox-$FIREFOX_VERSION/firefox /usr/bin/firefox
ARG GK_VERSION=v0.19.1
RUN wget --no-verbose -O /tmp/geckodriver.tar.gz http://github.com/mozilla/geckodriver/releases/download/$GK_VERSION/geckodriver-$GK_VERSION-linux64.tar.gz \
   && rm -rf /opt/geckodriver \
   && tar -C /opt -zxf /tmp/geckodriver.tar.gz \
   && rm /tmp/geckodriver.tar.gz \
   && mv /opt/geckodriver /opt/geckodriver-$GK_VERSION \
   && chmod 755 /opt/geckodriver-$GK_VERSION \
   && ln -fs /opt/geckodriver-$GK_VERSION /usr/bin/geckodriver

Making the following changes based on what @Florent B. had linked was the fix for it. Essentially firefox-esr is version 52 and the -headless option for Firefox was released in version 55. I am not sure what version iceweasel is but presumably it is earlier than that. Additionally versions of Firefox above 52 will not work without libgtk-3. I presume Debian 8 still has libgtk-2 so one would need to install that as well. Headless browsing works perfect with build-essential, libgtk-3-dev, wget, and libgl1-mesa-glx on Debian 8.

quantik
  • 776
  • 12
  • 26
  • with debian:stretch and the above script i get ```XPCOMGlueLoad error for file /firefox/libxul.so: libdbus-glib-1.so.2: cannot open shared object file: No such file or directory Couldn't load XPCOM.``` – Dorin Nov 18 '19 at 12:40
  • running `apt-get install -y libdbus-glib-1-2` fixes it – Dorin Nov 18 '19 at 13:00
  • anyone can visit this link. this is pretty helpful. https://github.com/SeleniumHQ/docker-selenium/blob/trunk/NodeFirefox/Dockerfile.txt – sharif_42 Dec 14 '20 at 08:45
2

You should never install Firefox using package manager. You can find all the firefox releases on below link

https://download-installer.cdn.mozilla.net/pub/firefox/releases/

If you look at the Selenium Firefox Dockerfile

https://github.com/SeleniumHQ/docker-selenium/blob/master/NodeFirefox/Dockerfile

They download the required version using

wget --no-verbose -O /tmp/firefox.tar.bz2 $FIREFOX_DOWNLOAD_URL

And for dependencies issues they run the below command

apt-get -qqy --no-install-recommends install firefox

And then later remove the firefox package

apt-get -y purge firefox

This makes sure that you don't need to worry about all required dependencies. If you want you can still get dependencies

$ apt-cache depends firefox | grep Depends
  Depends: lsb-release
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libcairo-gobject2
  Depends: libcairo2
  Depends: libdbus-1-3
  Depends: libdbus-glib-1-2
  Depends: libfontconfig1
  Depends: libfreetype6
  Depends: libgcc1
  Depends: libgdk-pixbuf2.0-0
  Depends: libglib2.0-0
  Depends: libgtk-3-0
  Depends: libpango-1.0-0
  Depends: libpangocairo-1.0-0
  Depends: libstartup-notification0
  Depends: libstdc++6
  Depends: libx11-6
  Depends: libx11-xcb1
  Depends: libxcb-shm0
  Depends: libxcb1
  Depends: libxcomposite1
  Depends: libxdamage1
  Depends: libxext6
  Depends: libxfixes3
  Depends: libxrender1
  Depends: libxt6

If you look at the below link

https://developer.mozilla.org/en-US/Firefox/Headless_mode

Browser support

Headless Firefox works on Fx55+ on Linux, and 56+ on Windows/Mac.

Community
  • 1
  • 1
Tarun Lalwani
  • 142,312
  • 9
  • 204
  • 265