PhantomJS is a headless WebKit with JavaScript API. It can be used for headless website testing.
PhantomJS has a lot of different uses. The interesting bit for me is to use PhantomJS as a lighter-weight replacement for a browser when running web acceptance tests. This enables faster testing, without a display or the overhead of full-browser startup/shutdown.
I write my web automation using Selenium WebDriver, in Python.
In future versions of PhantomJS, the GhostDriver component will be included.
GhostDriver is a pure JavaScript implementation of the WebDriver Wire Protocol for PhantomJS. It's a Remote WebDriver that uses PhantomJS as back-end.
So, Ghostdriver is the bridge we need to use Selenium WebDriver with Phantom.JS.
Since it is not available in the current PhantomJS release, you can try it yourself by compiling a special version of PhantomJS:
It wes pretty trvial to setup on Ubuntu (12.04):
$ sudo apt-get install build-essential chrpath git-core libssl-dev libfontconfig1-dev
$ git clone git://github.com/ariya/phantomjs.git
$ cd phantomjs
$ git checkout 1.8
$ ./build.sh
$ git remote add detro https://github.com/detro/phantomjs.git
$ git fetch detro && git checkout -b detro-ghostdriver-dev remotes/detro/ghostdriver-dev
$ ./build.sh
Then grab the `phantomjs` binary it produced (look inside `phantomjs/bin`). This is a self-contained executable, it can be moved to a different directory or another machine. Make sure it is located somewhere on your PATH, or declare it's location when creating your PhantomJS driver like the example below.
for these examples, `phantomjs` binary is located in same directory as test script.
Example: Python Using PhantomJS and Selenium WebDriver.
#!/usr/bin/env python
driver = webdriver.PhantomJS('./phantomjs')
# do webdriver stuff here
driver.quit()
Example: Python Unit Test Using PhantomJS and Selenium WebDriver.
#!/usr/bin/env python
import unittest
from selenium import webdriver
class TestUbuntuHomepage(unittest.TestCase):
def setUp(self):
self.driver = webdriver.PhantomJS('./phantomjs')
def testTitle(self):
self.driver.get('http://www.ubuntu.com/')
self.assertIn('Ubuntu', self.driver.title)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
resources: