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
@telemakhos
Copy link

What's up with the comments? I guess we can use this as reference at least...

@marcelaraujo
Copy link

It is working on Ubuntu 15.04

@tsl0922
Copy link

tsl0922 commented Aug 26, 2015

Working for me on Ubuntu 14.04! I've installed ttf-wqy-microhei to display chinese words.

Install x11vnc and run x11vnc --listen 0.0.0.0 -rfbport 5900 -display :99 -forever, then you can use vnc clients to connect to xvfb display.

@stuart-leitch
Copy link

Needs node ( & npm) installed as pre-reqs for protractor.

Line 19 is missing a comment char.

@Stephen-Williams
Copy link

Thank you so much for this script!
I've been banging my head against a wall for DAYS trying to get a headless protractor/selenium set up that works (ubuntu 15.04 wily, btw) and this script did the trick! To be honest, looking at these commands, I'm still not sure which part I was missing. Feels like I tried all this before, but maybe not in the right order?
Anyway, you're a life-saver. Thanks a ton!

@luckily
Copy link

luckily commented Feb 23, 2016

thanks a lot !!!!!

@joviano-dias
Copy link

as @leitchst points out, some things are missing

sudo: npm: command not found
sudo: webdriver-manager: command not found

@nousacademy
Copy link

nousacademy commented Jul 1, 2016

how do you view the html, once you get it running?? Whats the difference in running this vs phantomjs. I run Xvfb -ac :99 -screen 0 1280x1024x16 & export DISPLAY=:99 but how and where is it running so I can see it?

@DanielGGordon
Copy link

So how can this be integrated with my existing Java code? Will it just work automatically now and use headless mode every time I start my java app? I'm using selenium chromedriver.

@aijanai
Copy link

aijanai commented Jan 13, 2017

A little note for "webdriver-manager start" users:
the X display needs to be set for the webdriver server, since this is the one launching Chrome, not for the script that executes the tests.

This is particularly critical for Jenkins users, which may have selenium launched in a separate job and the tests launched in another.

@bradisbell
Copy link

@nousacademy This is headless, so the whole point is that you don't see it. If you need to debug, you can use VNC to spin up a quick server:

x11vnc --listen 127.0.0.1 -rfbport 5900 -display :99

Then, connect to VNC on localhost with any VNC client.

@HarishMungaram
Copy link

I have Jenkins install on master and selenium stuff on a slave, after installing chrome, xvfb, chromedriver and dependencies to make "headless" chrome/selenium work[install on salve] when i build the script i am having " org.openqa.selenium.NoSuchSessionException: no such session " and Capabilities [{message=unknown error: Chrome failed to start: exited abnormally

I have not install selenium through.
#sudo apt-get -y install python python-pip
#sudo pip install selenium
No idea why i'm getting this error.
Pls help

@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