run tests on travis using chromedriver
diff --git a/.travis.yml b/.travis.yml
index 0f4b019..4cbf2e1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,3 +1,20 @@
 language: dart
+
 dart: dev
+
+before_install:
+  - export CHROMEDRIVER_BINARY=/usr/bin/chromium-browser
+  - export CHROMEDRIVER_ARGS=--no-sandbox
+  - /usr/bin/chromium-browser --version
+
+  - export DISPLAY=:99.0
+  - sh -e /etc/init.d/xvfb start
+
+before_script:
+# We use a slightly older version of chromedriver; the newer ones require a later
+# version of chromium than is available on travis by default.
+  - wget http://chromedriver.storage.googleapis.com/2.12/chromedriver_linux64.zip
+  - unzip chromedriver_linux64.zip
+  - sudo mv chromedriver /usr/bin/
+
 script: ./tool/travis.sh
diff --git a/test/src/alert_test.dart b/test/src/alert_test.dart
index ac18eae..345e807 100644
--- a/test/src/alert_test.dart
+++ b/test/src/alert_test.dart
@@ -2,6 +2,7 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
+
 import '../test_util.dart';
 
 void main() {
@@ -11,8 +12,7 @@
     WebElement output;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
       await driver.get(testPagePath);
       button = await driver.findElement(const By.tagName('button'));
       output = await driver.findElement(const By.id('settable'));
diff --git a/test/src/keyboard_test.dart b/test/src/keyboard_test.dart
index d3146c1..6397490 100644
--- a/test/src/keyboard_test.dart
+++ b/test/src/keyboard_test.dart
@@ -2,6 +2,7 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
+
 import '../test_util.dart';
 
 void main() {
@@ -10,8 +11,7 @@
     WebElement textInput;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.firefox);
+      driver = await createTestDriver();
       await driver.get(testPagePath);
       textInput =
           await driver.findElement(const By.cssSelector('input[type=text]'));
diff --git a/test/src/logs_test.dart b/test/src/logs_test.dart
index 03441e6..e09ffe3 100644
--- a/test/src/logs_test.dart
+++ b/test/src/logs_test.dart
@@ -3,14 +3,18 @@
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
 
+import '../test_util.dart';
+
 void main() {
   group('Logs', () {
     WebDriver driver;
 
     setUp(() async {
-      Map capabilities = Capabilities.chrome
-        ..[Capabilities.LOGGING_PREFS] = {LogType.PERFORMANCE: LogLevel.INFO};
-      driver = await WebDriver.createDriver(desiredCapabilities: capabilities);
+      Map capabilities = {
+        Capabilities.LOGGING_PREFS: {LogType.PERFORMANCE: LogLevel.INFO}
+      };
+
+      driver = await createTestDriver(additionalCapabilities: capabilities);
       await driver.get('http://www.google.com');
     });
 
diff --git a/test/src/mouse_test.dart b/test/src/mouse_test.dart
index c148d58..621f4da 100644
--- a/test/src/mouse_test.dart
+++ b/test/src/mouse_test.dart
@@ -2,6 +2,7 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
+
 import '../test_util.dart';
 
 void main() {
@@ -10,8 +11,7 @@
     WebElement button;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
       await driver.get(testPagePath);
       button = await driver.findElement(const By.tagName('button'));
     });
diff --git a/test/src/navigation_test.dart b/test/src/navigation_test.dart
index b0ec418..f6fbfe7 100644
--- a/test/src/navigation_test.dart
+++ b/test/src/navigation_test.dart
@@ -3,13 +3,14 @@
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
 
+import '../test_util.dart';
+
 void main() {
   group('Navigation', () {
     WebDriver driver;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
       await driver.get('http://www.google.com/ncr');
     });
 
diff --git a/test/src/options_test.dart b/test/src/options_test.dart
index 4c09e9c..ba9af04 100644
--- a/test/src/options_test.dart
+++ b/test/src/options_test.dart
@@ -3,13 +3,14 @@
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
 
+import '../test_util.dart';
+
 void main() {
   group('Cookies', () {
     WebDriver driver;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
       await driver.get('http://www.google.com');
     });
 
@@ -68,8 +69,7 @@
     WebDriver driver;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
     });
 
     tearDown(() => driver.quit());
diff --git a/test/src/target_locator_test.dart b/test/src/target_locator_test.dart
index 85a349a..63bac73 100644
--- a/test/src/target_locator_test.dart
+++ b/test/src/target_locator_test.dart
@@ -2,6 +2,7 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
+
 import '../test_util.dart';
 
 /**
@@ -14,8 +15,7 @@
     WebElement frame;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
       await driver.get(testPagePath);
       frame = await driver.findElement(new By.name('frame'));
     });
diff --git a/test/src/web_driver_test.dart b/test/src/web_driver_test.dart
index 9c81dbd..d0b0c29 100644
--- a/test/src/web_driver_test.dart
+++ b/test/src/web_driver_test.dart
@@ -2,13 +2,14 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
+
 import '../test_util.dart';
 
 void main() {
   group('WebDriver', () {
     group('create', () {
       test('default', () async {
-        WebDriver driver = await WebDriver.createDriver();
+        WebDriver driver = await createTestDriver();
         await driver.get('http://www.google.com');
         var element = await driver.findElement(new By.name('q'));
         expect(await element.name, 'input');
@@ -16,8 +17,7 @@
       });
 
       test('chrome', () async {
-        WebDriver driver = await WebDriver.createDriver(
-            desiredCapabilities: Capabilities.chrome);
+        WebDriver driver = await createTestDriver();
         await driver.get('http://www.google.com');
         var element = await driver.findElement(new By.name('q'));
         expect(await element.name, 'input');
@@ -25,6 +25,9 @@
       });
 
       test('firefox', () async {
+        // Avoid this test on the bot; currently we just test against chromedriver.
+        if (isRunningOnTravis()) return;
+
         WebDriver driver = await WebDriver.createDriver(
             desiredCapabilities: Capabilities.firefox);
         await driver.get('http://www.google.com');
@@ -38,8 +41,7 @@
       WebDriver driver;
 
       setUp(() async {
-        driver = await WebDriver.createDriver(
-            desiredCapabilities: Capabilities.chrome);
+        driver = await createTestDriver();
         await driver.get(testPagePath);
       });
 
diff --git a/test/src/web_element_test.dart b/test/src/web_element_test.dart
index 59f0b52..fa17209 100644
--- a/test/src/web_element_test.dart
+++ b/test/src/web_element_test.dart
@@ -2,6 +2,7 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
+
 import '../test_util.dart';
 
 void main() {
@@ -16,8 +17,7 @@
     WebElement invisible;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
       await driver.get(testPagePath);
       table = await driver.findElement(new By.tagName('table'));
       button = await driver.findElement(new By.tagName('button'));
diff --git a/test/src/window_test.dart b/test/src/window_test.dart
index 437fe7a..7b9353e 100644
--- a/test/src/window_test.dart
+++ b/test/src/window_test.dart
@@ -3,13 +3,14 @@
 import 'package:unittest/unittest.dart';
 import 'package:webdriver/webdriver.dart';
 
+import '../test_util.dart';
+
 void main() {
   group('Window', () {
     WebDriver driver;
 
     setUp(() async {
-      driver = await WebDriver.createDriver(
-          desiredCapabilities: Capabilities.chrome);
+      driver = await createTestDriver();
     });
 
     tearDown(() => driver.quit());
diff --git a/test/test_util.dart b/test/test_util.dart
index 491eef8..cf3dd7d 100644
--- a/test/test_util.dart
+++ b/test/test_util.dart
@@ -1,6 +1,8 @@
 library webdriver_test_util;
 
-import 'dart:io';
+import 'dart:async';
+import 'dart:io' hide Platorm;
+import 'dart:io' as io show Platform;
 
 import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
@@ -11,6 +13,8 @@
 final Matcher isSize = new isInstanceOf<Size>();
 final Matcher isPoint = new isInstanceOf<Point>();
 
+bool isRunningOnTravis() => io.Platform.environment['TRAVIS'] == 'true';
+
 String get testPagePath {
   if (_testPagePath == null) {
     _testPagePath = _getTestPagePath();
@@ -29,3 +33,28 @@
 }
 
 String _testPagePath;
+
+Future<WebDriver> createTestDriver({Map additionalCapabilities}) {
+  Map capabilities = Capabilities.chrome;
+  Map env = io.Platform.environment;
+
+  Map chromeOptions = {};
+
+  if (env['CHROMEDRIVER_BINARY'] != null) {
+    chromeOptions['binary'] = env['CHROMEDRIVER_BINARY'];
+  }
+
+  if (env['CHROMEDRIVER_ARGS'] != null) {
+    chromeOptions['args'] = env['CHROMEDRIVER_ARGS'].split(' ');
+  }
+
+  if (chromeOptions.isNotEmpty) {
+    capabilities['chromeOptions'] = chromeOptions;
+  }
+
+  if (additionalCapabilities != null) {
+    capabilities.addAll(additionalCapabilities);
+  }
+
+  return WebDriver.createDriver(desiredCapabilities: capabilities);
+}
diff --git a/tool/travis.sh b/tool/travis.sh
index d3712d6..9155308 100755
--- a/tool/travis.sh
+++ b/tool/travis.sh
@@ -12,4 +12,10 @@
   lib/webdriver.dart \
   test/webdriver_test.dart
 
-# TODO: Setup chromedriver / selenium and run test/webdriver_test.dart.
+if [ "$TRAVIS" ]; then
+  # Start chromedriver.
+  chromedriver --port=4444 --url-base=wd/hub &
+  
+  # Run test/webdriver_test.dart.
+  dart test/webdriver_test.dart
+fi