Merge pull request #64 from DrMarcII/master

More minor cleanup.
diff --git a/lib/src/capabilities.dart b/lib/src/capabilities.dart
index 0a55e04..273f8c8 100644
--- a/lib/src/capabilities.dart
+++ b/lib/src/capabilities.dart
@@ -14,6 +14,7 @@
 
 part of webdriver.core;
 
+/// Capabilities constants.
 class Capabilities {
   static const String browserName = "browserName";
   static const String platform = "platform";
@@ -53,6 +54,7 @@
   static Map<String, dynamic> get empty => new Map<String, dynamic>();
 }
 
+/// Browser name constants.
 class Browser {
   static const String firefox = "firefox";
   static const String safari = "safari";
@@ -64,6 +66,7 @@
   static const String ipad = "iPad";
 }
 
+/// Browser operating system constants.
 class BrowserPlatform {
   static const String any = "ANY";
   static const String android = "ANDROID";
diff --git a/lib/src/common.dart b/lib/src/common.dart
index 1c3afc2..632783a 100644
--- a/lib/src/common.dart
+++ b/lib/src/common.dart
@@ -30,7 +30,7 @@
   /// Searches for multiple elements within the context.
   Stream<WebElement> findElements(By by);
 
-  /// Searchs for an element within the context.
+  /// Searches for an element within the context.
   ///
   /// Throws [NoSuchElementException] if no matching element is found.
   Future<WebElement> findElement(By by);
diff --git a/lib/src/exception.dart b/lib/src/exception.dart
index 71561b9..031b399 100644
--- a/lib/src/exception.dart
+++ b/lib/src/exception.dart
@@ -89,112 +89,132 @@
 
   const WebDriverException._(this.statusCode, this.message);
 
+  @override
   String toString() => '$runtimeType ($statusCode): $message';
+
+  @override
+  bool operator ==(other) => other != null &&
+      other.runtimeType == this.runtimeType &&
+      other.statusCode == this.statusCode &&
+      other.message == this.message;
+
+  @override
+  int get hashCode => statusCode + message.hashCode;
 }
 
 class InvalidRequestException extends WebDriverException {
-  InvalidRequestException(statusCode, message) : super._(statusCode, message);
+  const InvalidRequestException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class UnknownException extends WebDriverException {
-  UnknownException(statusCode, message) : super._(statusCode, message);
+  const UnknownException(statusCode, message) : super._(statusCode, message);
 }
 
 class NoSuchDriverException extends WebDriverException {
-  NoSuchDriverException(statusCode, message) : super._(statusCode, message);
+  const NoSuchDriverException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class NoSuchElementException extends WebDriverException {
-  NoSuchElementException(statusCode, message) : super._(statusCode, message);
+  const NoSuchElementException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class NoSuchFrameException extends WebDriverException {
-  NoSuchFrameException(statusCode, message) : super._(statusCode, message);
+  const NoSuchFrameException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class UnknownCommandException extends WebDriverException {
-  UnknownCommandException(statusCode, message) : super._(statusCode, message);
+  const UnknownCommandException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class StaleElementReferenceException extends WebDriverException {
-  StaleElementReferenceException(statusCode, message)
+  const StaleElementReferenceException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class ElementNotVisibleException extends WebDriverException {
-  ElementNotVisibleException(statusCode, message)
+  const ElementNotVisibleException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class InvalidElementStateException extends WebDriverException {
-  InvalidElementStateException(statusCode, message)
+  const InvalidElementStateException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class ElementIsNotSelectableException extends WebDriverException {
-  ElementIsNotSelectableException(statusCode, message)
+  const ElementIsNotSelectableException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class JavaScriptException extends WebDriverException {
-  JavaScriptException(statusCode, message) : super._(statusCode, message);
+  const JavaScriptException(statusCode, message) : super._(statusCode, message);
 }
 
 class XPathLookupException extends WebDriverException {
-  XPathLookupException(statusCode, message) : super._(statusCode, message);
+  const XPathLookupException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class TimeoutException extends WebDriverException {
-  TimeoutException(statusCode, message) : super._(statusCode, message);
+  const TimeoutException(statusCode, message) : super._(statusCode, message);
 }
 
 class NoSuchWindowException extends WebDriverException {
-  NoSuchWindowException(statusCode, message) : super._(statusCode, message);
+  const NoSuchWindowException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class InvalidCookieDomainException extends WebDriverException {
-  InvalidCookieDomainException(statusCode, message)
+  const InvalidCookieDomainException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class UnableToSetCookieException extends WebDriverException {
-  UnableToSetCookieException(statusCode, message)
+  const UnableToSetCookieException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class UnexpectedAlertOpenException extends WebDriverException {
-  UnexpectedAlertOpenException(statusCode, message)
+  const UnexpectedAlertOpenException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class NoAlertOpenException extends WebDriverException {
-  NoAlertOpenException(statusCode, message) : super._(statusCode, message);
+  const NoAlertOpenException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class InvalidElementCoordinatesException extends WebDriverException {
-  InvalidElementCoordinatesException(statusCode, message)
+  const InvalidElementCoordinatesException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class IMENotAvailableException extends WebDriverException {
-  IMENotAvailableException(statusCode, message) : super._(statusCode, message);
+  const IMENotAvailableException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class IMEEngineActivationFailedException extends WebDriverException {
-  IMEEngineActivationFailedException(statusCode, message)
+  const IMEEngineActivationFailedException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class InvalidSelectorException extends WebDriverException {
-  InvalidSelectorException(statusCode, message) : super._(statusCode, message);
+  const InvalidSelectorException(statusCode, message)
+      : super._(statusCode, message);
 }
 
 class SessionNotCreatedException extends WebDriverException {
-  SessionNotCreatedException(statusCode, message)
+  const SessionNotCreatedException(statusCode, message)
       : super._(statusCode, message);
 }
 
 class MoveTargetOutOfBoundsException extends WebDriverException {
-  MoveTargetOutOfBoundsException(statusCode, message)
+  const MoveTargetOutOfBoundsException(statusCode, message)
       : super._(statusCode, message);
 }
diff --git a/lib/src/web_driver.dart b/lib/src/web_driver.dart
index 173b8fc..fc64ed1 100644
--- a/lib/src/web_driver.dart
+++ b/lib/src/web_driver.dart
@@ -117,8 +117,10 @@
   Mouse get mouse => new Mouse._(this);
 
   /// Take a screenshot of the current page as PNG.
-  Future<List<int>> captureScreenshot() => getRequest('screenshot')
-      .then((screenshot) => CryptoUtils.base64StringToBytes(screenshot));
+  Stream<int> captureScreenshot() async* {
+    var encoded = await getRequest('screenshot');
+    yield* new Stream.fromIterable(CryptoUtils.base64StringToBytes(encoded));
+  }
 
   /// Inject a snippet of JavaScript into the page for execution in the context
   /// of the currently selected frame. The executed script is assumed to be
diff --git a/pubspec.yaml b/pubspec.yaml
index 3f50916..9c96059 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: webdriver
-version: 0.10.0-pre.3
+version: 0.10.0-pre.4
 author: Google, Inc.
 description: >
   Provides WebDriver bindings for Dart. These use the WebDriver JSON interface,
diff --git a/test/src/web_driver_test.dart b/test/src/web_driver_test.dart
index 7634055..ae28d9a 100644
--- a/test/src/web_driver_test.dart
+++ b/test/src/web_driver_test.dart
@@ -176,7 +176,7 @@
       });
 
       test('captureScreenshot', () async {
-        var screenshot = await driver.captureScreenshot();
+        var screenshot = await driver.captureScreenshot().toList();
         expect(screenshot, hasLength(isPositive));
         expect(screenshot, everyElement(new isInstanceOf<int>()));
       });