Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save alonisser/11192482 to your computer and use it in GitHub Desktop.
Save alonisser/11192482 to your computer and use it in GitHub Desktop.
#!/bin/bash
#
# Bash script to setup headless Selenium (uses Xvfb and Chrome)
# (Tested on Ubuntu 12.04) trying on ubuntu server 14.04
# Add Google Chrome's repo to sources.list
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee -a /etc/apt/sources.list
# Install Google's public key used for signing packages (e.g. Chrome)
# (Source: http://www.google.com/linuxrepositories/)
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
# Update apt sources:
sudo apt-get update
# Install Python, pip, Selenium:
#sudo apt-get -y install python python-pip
#sudo pip install selenium
different way to get chromedriver and selenium java jar:
sudo apt-get -y install default-jre # if not installed yet
sudo npm install protractor -g
sudo webdriver-manager update
sudo ln /usr/lib/node_modules/protractor/selenium/chromedriver /usr/bin/chromedriver
#sudo apt-get -y install unzip
# Download/Install chromedriver
# (http://code.google.com/p/chromedriver/):
#
# For x86:
#wget -c http://chromedriver.googlecode.com/files/chromedriver_linux32_2.1.zip
#unzip chromedriver_linux32_2.1.zip
#
# For x86-64:
#wget -c http://chromedriver.googlecode.com/files/chromedriver_linux64_2.1.zip
#unzip chromedriver_linux64_2.1.zip
# Neither creating symbolic link nor adding dir to $PATH worked for me
# in a Vagrant VM. So, let's blatantly copy the binary:
#sudo cp ./chromedriver /usr/bin/
#sudo chmod ugo+rx /usr/bin/chromedriver
# Install Google Chrome:
sudo apt-get -y install libxpm4 libxrender1 libgtk2.0-0 libnss3 libgconf-2-4
sudo apt-get -y install google-chrome-stable
# Dependencies to make "headless" chrome/selenium work:
sudo apt-get -y install xvfb gtk2-engines-pixbuf
sudo apt-get -y install xfonts-cyrillic xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable
# Optional but nifty: For capturing screenshots of Xvfb display:
sudo apt-get -y install imagemagick x11-apps
# Make sure that Xvfb starts everytime the box/vm is booted:
echo "Starting X virtual framebuffer (Xvfb) in background..."
Xvfb -ac :99 -screen 0 1280x1024x16 &
export DISPLAY=:99
# Optionally, capture screenshots using the command:
#xwd -root -display :99 | convert xwd:- screenshot.png
@evserykh
Copy link

Here is working Dockerfile:

FROM ruby:2.5                                                                                                              
                                                                                                                           
ENV DEBIAN_FRONTEND noninteractive                                                                                         
                                                                                                                           
ENV CONTAINER_LOCALE en_US                                                                                                 
RUN apt-get update && \                                                                                                    
    apt-get install -y locales                                                                                             
RUN sed -i -e "s/# ${CONTAINER_LOCALE}.UTF-8 UTF-8/${CONTAINER_LOCALE}.UTF-8 UTF-8/" /etc/locale.gen && \                  
    dpkg-reconfigure --frontend=noninteractive locales && \                                                                
    update-locale LANG=${CONTAINER_LOCALE}.UTF-8                                                                           
ENV LANG ${CONTAINER_LOCALE}.UTF-8                                                                                         
                                                                                                                           
RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - && \                                                            
    apt-get install -y --no-install-recommends nodejs                                                                      
                                                                                                                           
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \                                                 
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \                     
    apt-get update && \                                                                                                    
    apt-get install -y --no-install-recommends yarn                                                                        
                                                                                                                           
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" | tee -a /etc/apt/sources.list && \                      
    curl -sS https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \                                    
    apt-get update && \                                                                                                    
    apt-get -y --no-install-recommends install libxpm4 libxrender1 libgtk2.0-0 libnss3 libgconf-2-4 && \                   
    apt-get -y --no-install-recommends install google-chrome-stable                                                        
                                                                                                                           
RUN apt-get -y --no-install-recommends install xvfb gtk2-engines-pixbuf && \                                               
    apt-get -y --no-install-recommends install xfonts-cyrillic xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable && \
    apt-get -y --no-install-recommends install imagemagick x11-apps                                                        
                                                                                                                           
RUN apt-get -y --no-install-recommends install default-jre && \                                                            
    npm install protractor -g && \                                                                                         
    webdriver-manager update ---versions.chrome 2.35 --gecko false && \                                                    
    ln /usr/lib/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.35 /usr/bin/chromedriver 
                                                                                                                           
RUN touch /usr/bin/docker-entrypoint && { \                                                                                
      echo '#!/bin/bash'; \                                                                                                
      echo 'echo "Starting X virtual framebuffer (Xvfb) in background..."'; \                                              
      echo 'Xvfb -ac :99 -screen 0 1280x1024x16 &'; \                                                                      
      echo 'export DISPLAY=:99'; \                                                                                         
      echo 'bash -c "$@"'; \                                                                                               
    } > /usr/bin/docker-entrypoint && \                                                                                    
    chmod +x /usr/bin/docker-entrypoint                                                                                    
                                                                                                                           
ENTRYPOINT ["docker-entrypoint"]                                                                                           
CMD ["bash"] 

Here is working inside the container ruby script:

require 'selenium-webdriver'                                                                                               
                                                                                                                           
# Selenium::WebDriver.logger.level = :debug                                                                                
options = Selenium::WebDriver::Chrome::Options.new                                                                         
options.add_argument('--headless')                                                                                         
options.add_argument('--no-sandbox')                                                                                       
driver = Selenium::WebDriver.for :chrome, options: options                                                                 
                                                                                                                           
driver.manage.window.resize_to(1280, 1024)                                                                                 
driver.navigate.to "https://google.com"                                                                                    
driver.save_screenshot "image.png"

@josuehenrique
Copy link

tnks a lot guy... you save my life

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment