<!DOCTYPE html>
<!--
Copyright 2011 Software Freedom Conservancy. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<head>
  <title>webdriver_test.html</title>
  <script src="test_bootstrap.js"></script>
  <script>
    goog.require('bot.ErrorCode');
    goog.require('goog.functions');
    goog.require('goog.json');
    goog.require('goog.testing.PropertyReplacer');
    goog.require('goog.testing.MockControl');
    goog.require('goog.testing.jsunit');
    goog.require('webdriver.Command');
    goog.require('webdriver.CommandExecutor');
    goog.require('webdriver.CommandName');
    goog.require('webdriver.WebDriver');
    goog.require('webdriver.Session');
    goog.require('webdriver.promise');
    goog.require('webdriver.promise.Application');
    goog.require('webdriver.promise.Deferred');
    goog.require('webdriver.promise.Promise');
    goog.require('webdriver.test.AppTester');
    goog.require('webdriver.test.testutil');
  </script>
</head>
<body>
  <script>
  var SESSION_ID = 'test_session_id';

  // Alias some long names that interfere with test readability.
  var CName = webdriver.CommandName,
      ECode = bot.ErrorCode,
      STUB_ERROR = webdriver.test.testutil.STUB_ERROR,
      throwStubError = webdriver.test.testutil.throwStubError,
      assertIsStubError = webdriver.test.testutil.assertIsStubError,
      callbackHelper = webdriver.test.testutil.callbackHelper,
      callbackPair = webdriver.test.testutil.callbackPair;

  // By is exported by webdriver.Locator, but IDEs don't
  // recognize goog.exportSymbol. Explicitly define it here to make
  // the IDE stop complaining.
  var By = webdriver.Locator.Strategy;

  var clock;
  var driver;
  var mockControl;
  var appTester;
  var verifyAll;

  function setUp() {
    clock = webdriver.test.testutil.createMockClock();
    appTester = new webdriver.test.AppTester(clock);
    mockControl = new goog.testing.MockControl();
    verifyAll = callbackHelper(goog.bind(mockControl.$verifyAll, mockControl));
  }


  function tearDown() {
    appTester.$tearDown();
    verifyAll.assertCalled('Never verified mocks');
    clock.uninstall();
    mockControl.$tearDown();
  }


  function expectedError(code, message) {
    return function(e) {
      assertEquals('Wrong error code', code, e.code);
      assertEquals('Wrong error message', message, e.message);
    };
  }


  function createCommandMatcher(commandName, parameters) {
    return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {
      assertEquals('wrong name', commandName, actual.getName());
      var differences = goog.testing.asserts.findDifferences(
          parameters, actual.getParameters());
      assertNull(
          'Wrong parameters for "' + commandName + '"' +
              '\n    Expected: ' + goog.json.serialize(parameters) +
              '\n    Actual: ' + goog.json.serialize(actual.getParameters()),
          differences);
      return true;
    }, commandName + '(' + goog.json.serialize(parameters) + ')');
  }


  TestHelper = function() {
    this.executor = mockControl.createStrictMock(webdriver.CommandExecutor);
    this.execute = function() {
      fail('Expectations not set!');
    };
  };


  TestHelper.expectingFailure = function(opt_errback) {
    var helper = new TestHelper();

    helper.execute = function() {
      appTester.$runApplication(null, function(e) {
        verifyAll();
        (opt_errback || goog.nullFunction)(e);
      });
    };

    return helper;
  };


  TestHelper.expectingSuccess = function(opt_callback) {
    var helper = new TestHelper();

    helper.execute = function() {
      appTester.$runApplication(function() {
        verifyAll();
        (opt_callback || goog.nullFunction)();
      });
    };

    return helper;
  };


  TestHelper.prototype.expect = function(commandName, opt_parameters) {
    return new TestHelper.Command(this, commandName, opt_parameters);
  };


  TestHelper.prototype.replayAll = function() {
    mockControl.$replayAll();
    return this;
  };


  TestHelper.Command = function(testHelper, commandName, opt_parameters) {
    this.helper_ = testHelper;
    this.name_ = commandName;
    this.toDo_ = null;
    this.sessionId_ = SESSION_ID;
    this.withParameters(opt_parameters || {});
  };


  TestHelper.Command.prototype.withParameters = function(parameters) {
    this.parameters_ = parameters;
    if (this.name_ !== CName.NEW_SESSION) {
      this.parameters_['sessionId'] = this.sessionId_;
    }
    return this;
  };


  TestHelper.Command.prototype.buildExpectation_ = function() {
    var commandMatcher = createCommandMatcher(this.name_, this.parameters_);
    assertNotNull(this.toDo_);
    this.helper_.executor.
        execute(commandMatcher, goog.testing.mockmatchers.isFunction).
        $does(this.toDo_);
  };


  TestHelper.Command.prototype.andReturn = function(code, opt_value) {
    this.toDo_ = function(command, callback) {
      callback(null, {
        'status': code,
        'sessionId': {
          'value': SESSION_ID
        },
        'value': goog.isDef(opt_value) ? opt_value : null
      });
    };
    return this;
  };


  TestHelper.Command.prototype.andReturnSuccess = function(opt_returnValue) {
    return this.andReturn(ECode.SUCCESS, opt_returnValue);
  };


  TestHelper.Command.prototype.andReturnError = function(errCode, opt_value) {
    return this.andReturn(errCode, opt_value);
  };


  TestHelper.Command.prototype.replayAll = function() {
    if (!this.toDo_) {
      this.andReturnSuccess(null);
    }
    this.buildExpectation_();
    return this.helper_.replayAll();
  };


  TestHelper.Command.prototype.expect = function(name, opt_parameters) {
    if (!this.toDo_) {
      this.andReturnSuccess(null);
    }
    this.buildExpectation_();
    return this.helper_.expect(name, opt_parameters);
  };


  /**
   * @param {!(webdriver.Session|webdriver.promise.Promise)} opt_session The
   *     session to use.
   * @return {!webdriver.WebDriver} A new driver instance.
   */
  TestHelper.prototype.createDriver = function(opt_session) {
    var session = opt_session || new webdriver.Session(SESSION_ID, {});
    return new webdriver.WebDriver(session, this.executor);
  };


  //////////////////////////////////////////////////////////////////////////////
  //
  //    Tests
  //
  //////////////////////////////////////////////////////////////////////////////

  function testAttachToSession_sessionIsAvailable() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.DESCRIBE_SESSION).
        withParameters({'sessionId': SESSION_ID}).
        andReturnSuccess({'browserName': 'firefox'}).
        replayAll();

    var callback;
    var driver = webdriver.WebDriver.attachToSession(testHelper.executor,
        SESSION_ID);
    driver.getSession().then(callback = callbackHelper(function(session) {
      webdriver.test.testutil.assertObjectEquals({
        'value':'test_session_id'
      }, session.getId());
      assertEquals('firefox', session.getCapability('browserName'));
    }));
    testHelper.execute();
    callback.assertCalled();
  }


  function testAttachToSession_failsToGetSessionInfo() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.DESCRIBE_SESSION).
        withParameters({'sessionId': SESSION_ID}).
        andReturnError(ECode.UNKNOWN_ERROR, {'message': 'boom'}).
        replayAll();

    var errback;
    var driver = webdriver.WebDriver.attachToSession(testHelper.executor,
        SESSION_ID);
    driver.getSession().then(null, errback = callbackHelper(function(e) {
      assertEquals(bot.ErrorCode.UNKNOWN_ERROR, e.code);
      assertEquals('boom', e.message);
    }));
    testHelper.execute();
    errback.assertCalled();
  }


  function testCreateSession_happyPath() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.NEW_SESSION).
        withParameters({
          'desiredCapabilities': {'browserName': 'firefox'}
        }).
        andReturnSuccess({'browserName': 'firefox'}).
        replayAll();

    var callback;
    var driver = webdriver.WebDriver.createSession(testHelper.executor, {
      'browserName': 'firefox'
    });
    driver.getSession().then(callback = callbackHelper(function(session) {
      webdriver.test.testutil.assertObjectEquals({
        'value':'test_session_id'
      }, session.getId());
      assertEquals('firefox', session.getCapability('browserName'));
    }));
    testHelper.execute();
    callback.assertCalled();
  }


  function testCreateSession_failsToCreateSession() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.NEW_SESSION).
        withParameters({
          'desiredCapabilities': {'browserName': 'firefox'}
        }).
        andReturnError(ECode.UNKNOWN_ERROR, {'message': 'boom'}).
        replayAll();

    var errback;
    var driver = webdriver.WebDriver.createSession(testHelper.executor, {
      'browserName': 'firefox'
    });
    driver.getSession().then(null, errback = callbackHelper(function(e) {
      assertEquals(bot.ErrorCode.UNKNOWN_ERROR, e.code);
      assertEquals('boom', e.message);
    }));
    testHelper.execute();
    errback.assertCalled();
  }


  function testToWireValue_function() {
    var fn = function() { return 'foo'; };
    var callback;
    webdriver.WebDriver.toWireValue_(fn).
        then(callback = callbackHelper(function(value) {
          assertEquals(fn + '', value);
        }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_simpleObject() {
    var expected = {'sessionId': 'foo'};
    var callback;
    webdriver.WebDriver.toWireValue_({
      'sessionId': new webdriver.Session('foo', {})
    }).then(callback = callbackHelper(function(actual) {
      webdriver.test.testutil.assertObjectEquals(expected, actual);
    }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_nestedObject() {
    var expected = {'sessionId': {'value': 'foo'}};
    var callback;
    webdriver.WebDriver.toWireValue_({
      'sessionId': {
        'value': new webdriver.Session('foo', {})
      }
    }).then(callback = callbackHelper(function(actual) {
      webdriver.test.testutil.assertObjectEquals(expected, actual);
    }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_webElement() {
    var expected = {};
    expected[webdriver.WebElement.ELEMENT_KEY] = 'fefifofum';

    var element = new webdriver.WebElement({}, 'fefifofum');
    var callback;
    webdriver.WebDriver.toWireValue_(element).
        then(callback = callbackHelper(function(actual) {
          webdriver.test.testutil.assertObjectEquals(expected, actual);
        }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_domElement() {
    assertThrows(
        goog.partial(webdriver.WebDriver.toWireValue_, document.body));
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_simpleArray() {
    var expected = ['foo'];
    var callback;
    webdriver.WebDriver.toWireValue_([new webdriver.Session('foo', {})]).then(
        callback = callbackHelper(function(actual) {
          assertArrayEquals(expected, actual);
        }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_arrayWithWebElement() {
    var elementJson = {};
    elementJson[webdriver.WebElement.ELEMENT_KEY] = 'fefifofum';

    var element = new webdriver.WebElement({}, 'fefifofum');
    var callback;
    webdriver.WebDriver.toWireValue_([element]).
        then(callback = callbackHelper(function(actual) {
          assertTrue(goog.isArray(actual));
          assertEquals(1, actual.length);
          webdriver.test.testutil.assertObjectEquals(elementJson, actual[0]);
        }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_complexArray() {
    var elementJson = {};
    elementJson[webdriver.WebElement.ELEMENT_KEY] = 'fefifofum';
    var expected = ['abc', 123, true, elementJson, [123, {'foo': 'bar'}]];

    var element = new webdriver.WebElement({}, 'fefifofum');
    var input = ['abc', 123, true, element, [123, {'foo': 'bar'}]];
    var callback;
    webdriver.WebDriver.toWireValue_(input).
        then(callback = callbackHelper(function(actual) {
          webdriver.test.testutil.assertObjectEquals(expected, actual);
        }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testToWireValue_complexHash() {
    var elementJson = {};
    elementJson[webdriver.WebElement.ELEMENT_KEY] = 'fefifofum';
    var expected = {
      'script': 'return 1',
      'args': ['abc', 123, true, elementJson, [123, {'foo': 'bar'}]],
      'sessionId': 'foo'
    };

    var element = new webdriver.WebElement({}, 'fefifofum');
    var parameters = {
      'script': 'return 1',
      'args':['abc', 123, true, element, [123, {'foo': 'bar'}]],
      'sessionId': new webdriver.Session('foo', {})
    };

    var callback;
    webdriver.WebDriver.toWireValue_(parameters).
        then(callback = callbackHelper(function(actual) {
          webdriver.test.testutil.assertObjectEquals(expected, actual);
        }));
    callback.assertCalled();
    verifyAll();  // Expected by tear down.
  }


  function testFromWireValue_primitives() {
    assertEquals(1, webdriver.WebDriver.fromWireValue_({}, 1));
    assertEquals('', webdriver.WebDriver.fromWireValue_({}, ''));
    assertEquals(true, webdriver.WebDriver.fromWireValue_({}, true));

    assertUndefined(webdriver.WebDriver.fromWireValue_({}, undefined));
    assertNull(webdriver.WebDriver.fromWireValue_({}, null));

    verifyAll();  // Expected by tear down.
  }


  function testFromWireValue_webElements() {
    var driver = {};

    var json = {};
    json[webdriver.WebElement.ELEMENT_KEY] = 'foo';

    var element = webdriver.WebDriver.fromWireValue_(driver, json);
    assertEquals(driver, element.getDriver());

    var callback;
    webdriver.promise.when(element.id_, callback = callbackHelper(function(id) {
      webdriver.test.testutil.assertObjectEquals(json, id);
    }));
    callback.assertCalled();

    verifyAll();  // Expected by tear down.
  }


  function testFromWireValue_simpleObject() {
    var json = {'sessionId': 'foo'};
    var out = webdriver.WebDriver.fromWireValue_({}, json);
    webdriver.test.testutil.assertObjectEquals(json, out);
    verifyAll();  // Expected by tear down.
  }


  function testFromWireValue_nestedObject() {
    var json = {'foo': {'bar': 123}};
    var out = webdriver.WebDriver.fromWireValue_({}, json);
    webdriver.test.testutil.assertObjectEquals(json, out);
    verifyAll();  // Expected by tear down.
  }


  function testFromWireValue_array() {
    var json = [{'foo': {'bar': 123}}];
    var out = webdriver.WebDriver.fromWireValue_({}, json);
    webdriver.test.testutil.assertObjectEquals(json, out);
    verifyAll();  // Expected by tear down.
  }


  function testDoesNotExecuteCommandIfSessionDoesNotResolve() {
    var session = webdriver.promise.rejected(STUB_ERROR);
    var testHelper = TestHelper.
        expectingFailure(assertIsStubError).
        replayAll();
    testHelper.createDriver(session).getTitle();
    testHelper.execute();
  }


  function testCommandReturnValuesArePassedToFirstCallback() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        andReturnSuccess('Google Search').
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.getTitle().then(callback = callbackHelper(function(title) {
      assertEquals('Google Search', title);
    }));

    testHelper.execute();
    callback.assertCalled();
  }


  function testStopsCommandExecutionWhenAnErrorOccurs() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(ECode.NO_SUCH_WINDOW, 'window not found')).
        expect(CName.SWITCH_TO_WINDOW).
        withParameters({'name': 'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message': 'window not found'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.switchTo().window('foo');
    driver.getTitle();  // mock should blow if this gets executed

    testHelper.execute();
  }


  function testCanSuppressCommandFailures() {
    var callback;
    var testHelper = TestHelper.
        expectingSuccess(function() {
          callback.assertCalled();
        }).
        expect(CName.SWITCH_TO_WINDOW).
        withParameters({'name': 'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message': 'window not found'}).
        expect(CName.GET_TITLE).
        andReturnSuccess('Google Search').
        replayAll();

    var driver = testHelper.createDriver();
    driver.switchTo().window('foo').
        addErrback(callback = callbackHelper(function(e) {
          assertEquals(ECode.NO_SUCH_WINDOW, e.code);
          assertEquals('window not found', e.message);
          return true;  // suppress expected failure
        }));
    driver.getTitle();

    // The mock will verify that getTitle was executed, which is what we want.
    testHelper.execute();
  }


  function testErrorsPropagateUpToTheRunningApplication() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(ECode.NO_SUCH_WINDOW, 'window not found')).
        expect(CName.SWITCH_TO_WINDOW).
        withParameters({'name':'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message': 'window not found'}).
        replayAll();

    testHelper.createDriver().switchTo().window('foo');

    testHelper.execute();
  }


  function testErrbacksThatReturnErrorsStillSwitchToCallbackChain() {
    var callback;
    var testHelper = TestHelper.
        expectingSuccess(function() {
          callback.assertCalled();
        }).
        expect(CName.SWITCH_TO_WINDOW).
        withParameters({'name':'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.switchTo().window('foo').
        addErrback(function() { return STUB_ERROR; }).
        addCallback(callback = callbackHelper(assertIsStubError));

    testHelper.execute();
  }


  function testErrbacksThrownCanOverrideOriginalError() {
    var testHelper = TestHelper.
        expectingFailure(assertIsStubError).
        expect(CName.SWITCH_TO_WINDOW, {'name': 'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.switchTo().window('foo').addErrback(throwStubError);

    testHelper.execute();
  }


  function testCannotScheduleCommandsIfTheSessionIdHasBeenDeleted() {
    var testHelper = TestHelper.expectingSuccess().replayAll();
    var driver = testHelper.createDriver();
    delete driver.session_;
    assertThrows(goog.bind(driver.get, driver, 'http://www.google.com'));
    verifyAll();
  }


  function testDeletesSessionIdAfterQuitting() {
    var driver;
    var testHelper = TestHelper.
        expectingSuccess(function() {
          assertUndefined('Session ID should have been deleted', driver.session_);
        }).
        expect(CName.QUIT).
        replayAll();

    driver = testHelper.createDriver();
    driver.quit();
    testHelper.execute();
  }


  function testReportsErrorWhenExecutingCommandsAfterExecutingAQuit() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(undefined,
            'This driver instance does not have a valid session ID ' +
            '(did you call WebDriver.quit()?) and may no longer be used.')).
        expect(CName.QUIT).
        replayAll();

    var driver = testHelper.createDriver();
    driver.quit();
    driver.get('http://www.google.com');
    testHelper.execute();
  }


  function testCallbackCommandsExecuteBeforeNextCommand() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_CURRENT_URL).
        expect(CName.GET, {'url': 'http://www.google.com'}).
        expect(CName.CLOSE).
        expect(CName.GET_TITLE).
        replayAll();

    var driver = testHelper.createDriver();
    driver.getCurrentUrl().addCallback(function() {
      driver.get('http://www.google.com').addCallback(function() {
        driver.close();
      });
    });
    driver.getTitle();

    testHelper.execute();
  }


  function testEachCallbackFrameRunsToCompletionBeforeTheNext() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        expect(CName.GET_CURRENT_URL).
        expect(CName.GET_CURRENT_WINDOW_HANDLE).
        expect(CName.CLOSE).
        expect(CName.QUIT).
        replayAll();

    var driver = testHelper.createDriver();
    driver.getTitle().
        // Everything in this callback...
        addCallback(function() {
          driver.getCurrentUrl();
          driver.getWindowHandle();
        }).
        // ...should execute before everything in this callback.
        addCallback(function() {
          driver.close();
        });
    // This should execute after everything above
    driver.quit();

    testHelper.execute();
  }


  function testNestedCommandFailuresBubbleUpToGlobalHandlerIfUnsuppressed() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(ECode.NO_SUCH_WINDOW, 'window not found')).
        expect(CName.GET_TITLE).
        expect(CName.SWITCH_TO_WINDOW, {'name': 'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.getTitle().
        addCallback(function(){
          driver.switchTo().window('foo');
        });

    testHelper.execute();
  }


  function testNestedCommandFailuresCanBeSuppressWhenTheyOccur() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        expect(CName.SWITCH_TO_WINDOW, {'name':'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        expect(CName.CLOSE).
        replayAll();

    var driver = testHelper.createDriver();
    driver.getTitle().
        addCallback(function(){
          driver.switchTo().window('foo').
            addErrback(goog.functions.TRUE);
        });
    driver.close();
    testHelper.execute();
  }


  function testNestedCommandFailuresBubbleUpThroughTheFrameStack() {
    var callback;
    var testHelper = TestHelper.
        expectingSuccess(function() {
            callback.assertCalled('Error did not bubble up');
        }).
        expect(CName.GET_TITLE).
        expect(CName.SWITCH_TO_WINDOW, {'name':'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.getTitle().
        addCallback(function(){
          return driver.switchTo().window('foo');
        }).
        addErrback(callback = callbackHelper(function(e) {
          assertEquals(ECode.NO_SUCH_WINDOW, e.code);
          assertEquals('window not found', e.message);
          return true;  // Suppress the error.
        }));

    testHelper.execute();
  }


  function testNestedCommandFailuresCanBeCaughtAndSuppressed() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        expect(CName.GET_CURRENT_URL).
        expect(CName.SWITCH_TO_WINDOW, {'name':'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        expect(CName.CLOSE).
        replayAll();

    var driver = testHelper.createDriver();
    driver.getTitle().addCallback(function() {
      driver.getCurrentUrl().
          addCallback(function() {
            return driver.switchTo().window('foo');
          }).
          addErrback(goog.functions.TRUE);
      driver.close();
    });

    // Let the mock verify everything.
    testHelper.execute();
  }


  function testReturningADeferredResultFromACallback() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        expect(CName.GET_CURRENT_URL).
        andReturnSuccess('http://www.google.com').
        replayAll();

    var driver = testHelper.createDriver();
    driver.getTitle().
        addCallback(function() {
          return driver.getCurrentUrl();
        }).
        addCallback(function(value) {
          assertEquals('http://www.google.com', value);
        });
    testHelper.execute();
  }


  function testReturningADeferredResultFromAnErrbackSuppressesTheError() {
    var count = 0;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertEquals(2, count);
        }).
        expect(CName.SWITCH_TO_WINDOW, {'name':'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        expect(CName.GET_CURRENT_URL).
        andReturnSuccess('http://www.google.com').
        replayAll();

    var driver = testHelper.createDriver();
    driver.switchTo().window('foo').
        addErrback(function(e) {
          assertEquals(ECode.NO_SUCH_WINDOW, e.code);
          assertEquals('window not found', e.message);
          count += 1;
          return driver.getCurrentUrl();
        }).
        addCallback(function(url) {
          count += 1;
          assertEquals('http://www.google.com', url);
        });
    testHelper.execute();
  }


  function testExecutingACustomFunctionThatReturnsANonDeferred() {
    var called = false;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertTrue('Callback not called', called);
        }).
        replayAll();

    var driver = testHelper.createDriver();
    driver.call(goog.functions.constant('abc123')).addCallback(function(value) {
      called = true;
      assertEquals('abc123', value);
    });
    testHelper.execute();
  }


  function testExecutionOrderwithCustomFunctions() {
    var msg = [];
    var testHelper = TestHelper.expectingSuccess(function() {
          assertEquals('cheese is tasty!', msg.join(''));
        }).
        expect(CName.GET_TITLE).andReturnSuccess('cheese ').
        expect(CName.GET_CURRENT_URL).andReturnSuccess('tasty').
        replayAll();

    var driver = testHelper.createDriver();

    driver.getTitle().addCallback(msg.push, msg);
    driver.call(goog.functions.constant('is ')).addCallback(msg.push, msg);
    driver.getCurrentUrl().addCallback(msg.push, msg);
    driver.call(goog.functions.constant('!')).addCallback(msg.push, msg);

    testHelper.execute();
  }


  function testPassingArgumentsToACustomFunction() {
    var testHelper = TestHelper.expectingSuccess().replayAll();

    var add = callbackHelper(function(a, b) {
      return a + b;
    });
    var driver = testHelper.createDriver();
    driver.call(add, null, 1, 2).
        addCallback(function(value) {
          assertEquals(3, value);
        });
    testHelper.execute();
    add.assertCalled();
  }

  function testPassingPromisedArgumentsToACustomFunction() {
    var testHelper = TestHelper.expectingSuccess().replayAll();

    var promisedArg = new webdriver.promise.Deferred;
    var add = callbackHelper(function(a, b) {
      return a + b;
    });
    var driver = testHelper.createDriver();
    driver.call(add, null, 1, promisedArg).
        addCallback(function(value) {
          assertEquals(3, value);
        });

    appTester.$turnEventLoop();
    add.assertNotCalled();

    promisedArg.resolve(2);
    add.assertCalled();
    testHelper.execute();
  }

  function testPassingArgumentsAndScopeToACustomFunction() {
    function Foo(name) {
      this.name = name;
    }
    Foo.prototype.getName = function() {
      return this.name;
    };
    var foo = new Foo('foo');

    var called = false;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertTrue('Callback not called', called);
        }).
        replayAll();
    var driver = testHelper.createDriver();
    driver.call(foo.getName, foo).addCallback(function(value) {
      assertEquals('foo', value);
      called = true;
    });
    testHelper.execute();
  }


  function testExecutingACustomFunctionThatThrowsAnError() {
    var called = false;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertTrue('Callback not called', called);
        }).
        replayAll();
    var driver = testHelper.createDriver();
    driver.call(goog.functions.error('bam!')).addErrback(function(e) {
      assertTrue(e instanceof Error);
      assertEquals('bam!', e.message);
      called = true;
      return true;  // suppress the error.
    });
    testHelper.execute();
  }


  function testExecutingACustomFunctionThatSchedulesCommands() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        expect(CName.CLOSE).
        expect(CName.QUIT).
        replayAll();

    var driver = testHelper.createDriver();
    driver.call(function() {
      driver.getTitle();
      driver.close();
    });
    driver.quit();
    testHelper.execute();
  }


  function testExecutingAFunctionThatReturnsATaskResultAfterSchedulingAnother() {
    var called = false;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertTrue(called);
        }).
        expect(CName.GET_TITLE).
            andReturnSuccess('Google Search').
        expect(CName.CLOSE).
        replayAll();

    var driver = testHelper.createDriver();
    var result = driver.call(function() {
      var title = driver.getTitle();
      driver.close();
      return title;
    });

    result.addCallback(function(title) {
      called = true;
      assertEquals('Google Search', title);
    });

    testHelper.execute();
  }


  function testExecutingACustomFunctionWhoseNestedCommandFails() {
    var called = false;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertTrue('Callback not called', called);
        }).
        expect(CName.SWITCH_TO_WINDOW, {'name': 'foo'}).
        andReturnError(ECode.NO_SUCH_WINDOW, {'message':'window not found'}).
        replayAll();

    var driver = testHelper.createDriver();
    var result = driver.call(function() {
      return driver.switchTo().window('foo');
    });

    result.addErrback(function(e) {
      assertEquals(ECode.NO_SUCH_WINDOW, e.code);
      assertEquals('window not found', e.message);
      called = true;
      return true;  // suppress the error.
    });

    testHelper.execute();
  }


  function testCustomFunctionDoesNotCompleteUntilReturnedPromiseIsResolved() {
    var testHelper = TestHelper.expectingSuccess().replayAll();

    var d = new webdriver.promise.Deferred(),
        stepOne = callbackHelper(function() { return d.promise; }),
        stepTwo = callbackHelper();

    var driver = testHelper.createDriver();
    driver.call(stepOne);
    driver.call(stepTwo);

    appTester.$turnEventLoop();
    stepOne.assertCalled();
    stepTwo.assertNotCalled();

    appTester.$turnEventLoop();
    stepOne.assertCalled();
    stepTwo.assertNotCalled();

    d.resolve();
    testHelper.execute();
    stepTwo.assertCalled();
  }


  function testNestedFunctionCommandExecutionOrder() {
    var msg = [];
    var testHelper = TestHelper.expectingSuccess(function() {
          assertEquals('acefdb', msg.join(''));
        }).
        replayAll();

    var driver = testHelper.createDriver();
    driver.call(msg.push, msg, 'a');
    driver.call(function() {
      driver.call(msg.push, msg, 'c');
      driver.call(function() {
        driver.call(msg.push, msg, 'e');
        driver.call(msg.push, msg, 'f');
      });
      driver.call(msg.push, msg, 'd');
    });
    driver.call(msg.push, msg, 'b');
    testHelper.execute();
  }


  function testExecutingNestedFunctionCommands() {
    var msg = [];
    var testHelper = TestHelper.expectingSuccess(function() {
          assertEquals('cheese is tasty!', msg.join(''));
        }).
        replayAll();
    var driver = testHelper.createDriver();
    driver.call(goog.functions.constant('cheese ')).addCallback(msg.push, msg);
    driver.call(function() {
      driver.call(goog.functions.constant('is ')).addCallback(msg.push, msg);
      driver.call(goog.functions.constant('tasty')).addCallback(msg.push, msg);
    });
    driver.call(goog.functions.constant('!')).addCallback(msg.push, msg);
    testHelper.execute();
  }


  function testReturnValuesFromNestedFunctionCommands() {
    var count = 0;
    var testHelper = TestHelper.expectingSuccess(function() {
          assertEquals('not called', 1, count);
        }).
        replayAll();
    var driver = testHelper.createDriver();
    var result = driver.call(function() {
      return driver.call(function() {
        return driver.call(goog.functions.constant('foobar'));
      });
    });
    result.addCallback(function(value) {
      assertEquals('foobar', value);
      count += 1;
    });
    testHelper.execute();
  }


  function testExecutingANormalCommandAfterNestedCommandsThatReturnsAnAction() {
    var msg = [];
    var testHelper = TestHelper.expectingSuccess(function() {
          assertEquals('ab', msg.join(''));
        }).
        expect(CName.CLOSE).
        replayAll();
    var driver = testHelper.createDriver();
    driver.call(function() {
      return driver.call(function() {
        msg.push('a');
        return driver.call(goog.functions.constant('foobar'));
      });
    });
    driver.close().addCallback(function() {
      msg.push('b');
    });

    testHelper.execute();
  }


  function testNestedCommandErrorsBubbleUp() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(undefined, 'bam!')).
        replayAll();
    var driver = testHelper.createDriver();
    driver.call(function() {
      return driver.call(function() {
        return driver.call(goog.functions.error('bam!'));
      });
    });
    testHelper.execute();
  }


  function testExecutingNestedCustomFunctionsThatSchedulesCommands() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).
        expect(CName.CLOSE).
        replayAll();

    var driver = testHelper.createDriver();
    driver.call(function() {
      driver.call(function() {
        driver.getTitle();
      });
      driver.close();
    });
    testHelper.execute();
  }


  function testExecutingACustomFunctionThatReturnsADeferredAction() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.GET_TITLE).andReturnSuccess('Google').
        replayAll();

    var driver = testHelper.createDriver();
    driver.call(function() {
      return driver.getTitle();
    }).addCallback(function(title) {
      assertEquals('Google', title);
    });

    testHelper.execute();
  }

  function runWebElementResolutionTest(resolvedId) {
    var id = new webdriver.promise.Deferred();

    var callback, idCallback;
    var element = new webdriver.WebElement({}, id.promise);

    webdriver.promise.when(element,
        callback = callbackHelper(function(resolvedElement) {
          assertEquals(element, resolvedElement);
          assertFalse(element.toWireValue().isPending());
        }));

    webdriver.promise.when(element.toWireValue(),
        idCallback = callbackHelper(function(id) {
          assertEquals('object', goog.typeOf(id));
          assertEquals('foo', id[webdriver.WebElement.ELEMENT_KEY]);
        }));

    callback.assertNotCalled();
    idCallback.assertNotCalled();

    id.resolve(resolvedId);

    callback.assertCalled();
    idCallback.assertCalled();
    verifyAll();  // Make tearDown happy.
  }

  function testWebElement_resolvesWhenTheUnderlyingIdResolves() {
    runWebElementResolutionTest('foo');
  }

  function testWebElement_resolvesWhenIdResolvesToElementJsonObject() {
    runWebElementResolutionTest({'ELEMENT': 'foo'});
  }

  function testWebElement_resolvesWhenIdResolvesToAnotherElement() {
    runWebElementResolutionTest(
        new webdriver.WebElement({}, {'ELEMENT': 'foo'}));
  }

  function testWebElement_elementResolvesBeforeCallbacksOnWireValueTrigger() {
    var id = new webdriver.promise.Deferred();

    var callback, idCallback;
    var element = new webdriver.WebElement({}, id.promise);
    var messages = [];

    webdriver.promise.when(element, function() {
      messages.push('element resolved');
    });

    webdriver.promise.when(element.toWireValue(), function() {
      messages.push('wire value resolved');
    });

    assertArrayEquals([], messages);
    id.resolve('foo');
    assertArrayEquals([
      'element resolved',
      'wire value resolved'
    ], messages);
    verifyAll();  // Make tearDown happy.
  }

  function testWebElement_isRejectedIfUnderlyingIdIsRejected() {
    var id = new webdriver.promise.Deferred();

    var callback, errback;
    var element = new webdriver.WebElement({}, id.promise);

    webdriver.promise.when(element,
        callback = callbackHelper(),
        errback = callbackHelper(function(err) {
          assertEquals('foo', err);
        }));

    callback.assertNotCalled();
    errback.assertNotCalled();

    id.reject('foo');

    callback.assertNotCalled();
    errback.assertCalled();
    verifyAll();  // Make tearDown happy.
  }


  function testExecuteScript_nullReturnValue() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return document.body;',
              'args': []
            }).
            andReturnSuccess(null).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.executeScript('return document.body;').
        then(callback = callbackHelper(function(result) {
          assertNull(result);
        }));
    testHelper.execute();
    callback.assertCalled();
  }


  function testExecuteScript_primitiveReturnValue() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return document.body;',
              'args': []
            }).
            andReturnSuccess(123).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.executeScript('return document.body;').
        then(callback = callbackHelper(function(result) {
          assertEquals(123, result);
        }));
    testHelper.execute();
    callback.assertCalled();
  }


  function testExecuteScript_webElementReturnValue() {
    var json = {};
    json[webdriver.WebElement.ELEMENT_KEY] = 'foo';

    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return document.body;',
              'args': []
            }).
            andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.executeScript('return document.body;').
        then(function(webelement) {
          webdriver.promise.when(webelement.id_,
              callback = callbackHelper(function(id) {
                webdriver.test.testutil.assertObjectEquals(id, json);
              }));
        });
    testHelper.execute();
    callback.assertCalled();
  }


  function testExecuteScript_arrayReturnValue() {
    var json = [{}];
    json[0][webdriver.WebElement.ELEMENT_KEY] = 'foo';

    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return document.body;',
              'args': []
            }).
            andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.executeScript('return document.body;').
        then(function(array) {
          webdriver.promise.when(array[0].id_,
              callback = callbackHelper(function(id) {
                webdriver.test.testutil.assertObjectEquals(id, json[0]);
              }));
        });
    testHelper.execute();
    callback.assertCalled();
  }


  function testExecuteScript_objectReturnValue() {
    var json = {'foo':{}};
    json['foo'][webdriver.WebElement.ELEMENT_KEY] = 'foo';

    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return document.body;',
              'args': []
            }).
            andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.executeScript('return document.body;').
        then(function(obj) {
          webdriver.promise.when(obj['foo'].id_,
              callback = callbackHelper(function(id) {
                webdriver.test.testutil.assertObjectEquals(id, json['foo']);
              }));
        });
    testHelper.execute();
    callback.assertCalled();
  }


  function testExecuteScript_scriptAsFunction() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return (' + goog.nullFunction +
                        ').apply(null, arguments);',
              'args': []
            }).
            andReturnSuccess(null).
        replayAll();

    var driver = testHelper.createDriver();
    driver.executeScript(goog.nullFunction);
    testHelper.execute();
  }


  function testExecuteScript_simpleArgumentConversion() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return 1;',
              'args': ['abc', 123, true, [123, {'foo': 'bar'}]]
            }).
            andReturnSuccess(null).
        replayAll();

    var driver = testHelper.createDriver();
    driver.executeScript('return 1;', 'abc', 123, true, [123, {'foo': 'bar'}]);
    testHelper.execute();
  }


  function testExecuteScript_webElementArgumentConversion() {
    var elementJson = {};
    elementJson[webdriver.WebElement.ELEMENT_KEY] = 'fefifofum';

    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return 1;',
              'args': [elementJson]
            }).
            andReturnSuccess(null).
        replayAll();

    var driver = testHelper.createDriver();
    driver.executeScript('return 1;',
        new webdriver.WebElement(driver, 'fefifofum'));
    testHelper.execute();
  }


  function testExecuteScript_argumentConversion() {
    var elementJson = {};
    elementJson[webdriver.WebElement.ELEMENT_KEY] = 'fefifofum';

    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'return 1;',
              'args': ['abc', 123, true, elementJson, [123, {'foo': 'bar'}]]
            }).
            andReturnSuccess(null).
        replayAll();

    var driver = testHelper.createDriver();
    var element = new webdriver.WebElement(driver, 'fefifofum');
    driver.executeScript('return 1;',
        'abc', 123, true, element, [123, {'foo': 'bar'}]);
    testHelper.execute();
  }


  function testExecuteScript_scriptReturnsAnError() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(ECode.UNKNOWN_ERROR, 'bam')).
        expect(CName.EXECUTE_SCRIPT).
            withParameters({
              'script': 'throw Error(arguments[0]);',
              'args': ['bam']
            }).
            andReturnError(ECode.UNKNOWN_ERROR, {'message':'bam'}).
        replayAll();
    var driver = testHelper.createDriver();
    driver.executeScript('throw Error(arguments[0]);', 'bam');
    testHelper.execute();
  }


  function testFindElement_elementNotFound() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(ECode.NO_SUCH_ELEMENT, 'Unable to find element')).
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
        andReturnError(ECode.NO_SUCH_ELEMENT, {
            'message':'Unable to find element'
        }).
        replayAll();

    var driver = testHelper.createDriver();
    var element = driver.findElement(By.id('foo'));
    element.click();  // This should never execute.
    testHelper.execute();
  }


  function testFindElement_elementFound() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
            andReturnSuccess({'ELEMENT':'bar'}).
        expect(CName.CLICK_ELEMENT, {'id':{'ELEMENT':'bar'}}).
            andReturnSuccess().
        replayAll();

    var driver = testHelper.createDriver();
    var element = driver.findElement(By.id('foo'));
    element.click();
    testHelper.execute();
  }


  function testFindElement_canUseElementInCallback() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
            andReturnSuccess({'ELEMENT':'bar'}).
        expect(CName.CLICK_ELEMENT, {'id':{'ELEMENT':'bar'}}).
            andReturnSuccess().
        replayAll();

    var driver = testHelper.createDriver();
    driver.findElement(By.id('foo')).then(function(element) {
      element.click();
    });
    testHelper.execute();
  }


  function testFindElement_byJs() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': 'return document.body',
          'args': []
        }).
        andReturnSuccess({'ELEMENT':'bar'}).
        expect(CName.CLICK_ELEMENT, {'id':{'ELEMENT':'bar'}}).
        replayAll();

    var driver = testHelper.createDriver();
    var element = driver.findElement(By.js('return document.body'));
    element.click();  // just to make sure
    testHelper.execute();
  }


  function testFindElement_byJs_returnsNonWebElementValue() {
    var testHelper = TestHelper.
        expectingFailure(function(e) {
          assertEquals(
              'Not the expected error message',
              'JS locator script result was not a WebElement', e.message);
        }).
        expect(CName.EXECUTE_SCRIPT, {'script': 'return 123', 'args': []}).
        andReturnSuccess(123).
        replayAll();

    var driver = testHelper.createDriver();
    var element = driver.findElement(By.js('return 123'));
    element.click();  // Should not execute.
    testHelper.execute();
  }


  function testFindElement_byJs_canPassArguments() {
    var script = 'return document.getElementsByTagName(arguments[0]);';
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': script,
          'args': ['div']
        }).
        andReturnSuccess({'ELEMENT':'one'}).
        replayAll();
    var driver = testHelper.createDriver();
    driver.findElement(By.js(script), 'div');
    testHelper.execute();
  }


  function testIsElementPresent_elementNotFound() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([]).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.isElementPresent(By.id('foo')).
        then(callback = callbackHelper(function(result) {
          assertFalse(result);
        }));
    testHelper.execute();
    callback.assertCalled();
  }


  function testIsElementPresent_elementFound() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([{'ELEMENT':'bar'}]).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.isElementPresent(By.id('foo')).
        then(callback = callbackHelper(assertTrue));
    testHelper.execute();
    callback.assertCalled();
  }


  function testIsElementPresent_letsErrorsPropagate() {
    var testHelper = TestHelper.
        expectingFailure(expectedError(ECode.UNKNOWN_ERROR, 'There is no spoon')).
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnError(ECode.UNKNOWN_ERROR, {'message':'There is no spoon'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.isElementPresent(By.id('foo'));
    testHelper.execute();
  }


  function testIsElementPresent_byJs() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {'script': 'return 123', 'args': []}).
        andReturnSuccess([{'ELEMENT':'bar'}]).
        replayAll();

    var driver = testHelper.createDriver();
    var callback;
    driver.isElementPresent(By.js('return 123')).
        then(callback = callbackHelper(function(result) {
          assertTrue(result);
        }));
    testHelper.execute();
    callback.assertCalled();
  }


  function testIsElementPresent_byJs_canPassScriptArguments() {
    var script = 'return document.getElementsByTagName(arguments[0]);';
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': script,
          'args': ['div']
        }).
        andReturnSuccess({'ELEMENT':'one'}).
        replayAll();

    var driver = testHelper.createDriver();
    driver.isElementPresent(By.js(script), 'div');
    testHelper.execute();
  }


  function testFindElements() {
    var json = [
        {'ELEMENT':'foo'},
        {'ELEMENT':'bar'},
        {'ELEMENT':'baz'}
    ];
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.FIND_ELEMENTS, {'using':'tag name', 'value':'a'}).
        andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callbacks = [];
    driver.findElements(By.tagName('a')).addCallback(function(elements) {
      assertEquals(3, elements.length);

      function assertTypeAndId(index) {
        assertTrue('Not a WebElement at index ' + index,
            elements[index] instanceof webdriver.WebElement);
        elements[index].toWireValue().
            then(callbacks[index] = callbackHelper(function(id) {
              webdriver.test.testutil.assertObjectEquals(json[index], id);
            }));
      }

      assertTypeAndId(0);
      assertTypeAndId(1);
      assertTypeAndId(2);
    });

    testHelper.execute();
    assertEquals(3, callbacks.length);
    callbacks[0].assertCalled();
    callbacks[1].assertCalled();
    callbacks[2].assertCalled();
  }


  function testFindElements_byJs() {
    var json = [
        {'ELEMENT':'foo'},
        {'ELEMENT':'bar'},
        {'ELEMENT':'baz'}
    ];
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': 'return document.getElementsByTagName("div");',
          'args': []
        }).
        andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callbacks = [];
    driver.findElements(By.js('return document.getElementsByTagName("div");')).
        addCallback(function(elements) {
          assertEquals(3, elements.length);

          function assertTypeAndId(index) {
            assertTrue('Not a WebElement at index ' + index,
                elements[index] instanceof webdriver.WebElement);
            elements[index].toWireValue().
                then(callbacks[index] = callbackHelper(function(id) {
                  webdriver.test.testutil.assertObjectEquals(json[index], id);
                }));
          }

          assertTypeAndId(0);
          assertTypeAndId(1);
          assertTypeAndId(2);
        });

    testHelper.execute();
    assertEquals(3, callbacks.length);
    callbacks[0].assertCalled();
    callbacks[1].assertCalled();
    callbacks[2].assertCalled();
  }


  function testFindElements_byJs_filtersOutNonWebElementResponses() {
    var json = [
        {'ELEMENT':'foo'},
        123,
        'a',
        false,
        {'ELEMENT':'bar'},
        {'not a web element': 1},
        {'ELEMENT':'baz'}
    ];
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': 'return document.getElementsByTagName("div");',
          'args': []
        }).
        andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callbacks = [];
    driver.findElements(By.js('return document.getElementsByTagName("div");')).
        addCallback(function(elements) {
          assertEquals(3, elements.length);

          function assertTypeAndId(index, jsonIndex) {
            assertTrue('Not a WebElement at index ' + index,
                elements[index] instanceof webdriver.WebElement);
            elements[index].toWireValue().
                then(callbacks[index] = callbackHelper(function(id) {
                  webdriver.test.testutil.assertObjectEquals(json[jsonIndex], id);
                }));
          }

          assertTypeAndId(0, 0);
          assertTypeAndId(1, 4);
          assertTypeAndId(2, 6);
        });

    testHelper.execute();
    assertEquals(3, callbacks.length);
    callbacks[0].assertCalled();
    callbacks[1].assertCalled();
    callbacks[2].assertCalled();
  }


  function testFindElements_byJs_convertsSingleWebElementResponseToArray() {
    var json = {'ELEMENT':'foo'};
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': 'return document.getElementsByTagName("div");',
          'args': []
        }).
        andReturnSuccess(json).
        replayAll();

    var driver = testHelper.createDriver();
    var callback1, callback2;
    driver.findElements(By.js('return document.getElementsByTagName("div");')).
        then(callback1 = callbackHelper(function(elements) {
          assertEquals(1, elements.length);
          assertTrue(elements[0] instanceof webdriver.WebElement);
          elements[0].toWireValue().
              then(callback2 = callbackHelper(function(id) {
                webdriver.test.testutil.assertObjectEquals(json, id);
              }));
        }));

    testHelper.execute();
    callback1.assertCalled();
    callback2.assertCalled();
  }


  function testFindElements_byJs_canPassScriptArguments() {
    var script = 'return document.getElementsByTagName(arguments[0]);';
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.EXECUTE_SCRIPT, {
          'script': script,
          'args': ['div']
        }).
        andReturnSuccess([{'ELEMENT':'one'}, {'ELEMENT':'two'}]).
        replayAll();

    var driver = testHelper.createDriver();
    driver.findElements(By.js(script), 'div');
    testHelper.execute();
  }


  function testSendKeysConvertsVarArgsIntoStrings_simpleArgs() {
    var testHelper = TestHelper.
        expectingSuccess().
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
            andReturnSuccess({'ELEMENT':'one'}).
        expect(CName.SEND_KEYS_TO_ELEMENT, {'id':{'ELEMENT':'one'},
                                            'value':['1','2','abc','3']}).
            andReturnSuccess().
        replayAll();

    var driver = testHelper.createDriver();
    var element = driver.findElement(By.id('foo'));
    element.sendKeys(1, 2, 'abc', 3);
    testHelper.execute();
  }


  function testSendKeysConvertsVarArgsIntoStrings_promisedArgs() {
    var testHelper = TestHelper.
        expectingSuccess().
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
            andReturnSuccess({'ELEMENT':'one'}).
        expect(CName.SEND_KEYS_TO_ELEMENT, {'id':{'ELEMENT':'one'},
                                            'value':['abc', '123', 'def']}).
            andReturnSuccess().
        replayAll();

    var driver = testHelper.createDriver();
    var element = driver.findElement(By.id('foo'));
    element.sendKeys(webdriver.promise.resolved('abc'), 123,
                     webdriver.promise.resolved('def'));
    testHelper.execute();
  }

  function testElementEquality_isReflexive() {
    var a = new webdriver.WebElement({}, 'foo');
    var callback;
    webdriver.WebElement.equals(a, a).then(
        callback = callbackHelper(assertTrue));
    callback.assertCalled();
    verifyAll();  // for tearDown()
  }

  function testElementEquals_doesNotSendRpcIfElementsHaveSameId() {
    var a = new webdriver.WebElement({}, 'foo'),
        b = new webdriver.WebElement({}, 'foo'),
        c = new webdriver.WebElement({}, 'foo'),
        callback;

    webdriver.WebElement.equals(a, b).then(
        callback = callbackHelper(assertTrue));
    callback.assertCalled('a should == b!');
    webdriver.WebElement.equals(b, a).then(
        callback = callbackHelper(assertTrue));
    callback.assertCalled('symmetry check failed');
    webdriver.WebElement.equals(a, c).then(
        callback = callbackHelper(assertTrue));
    callback.assertCalled('a should == c!');
    webdriver.WebElement.equals(b, c).then(
        callback = callbackHelper(assertTrue));
    callback.assertCalled('transitive check failed');

    verifyAll();  // for tearDown()
  }

  function testElementEquals_sendsRpcIfElementsHaveDifferentIds() {
    var testHelper = TestHelper.
        expectingSuccess().
        expect(CName.ELEMENT_EQUALS,
            {'id':{'ELEMENT':'foo'}, 'other':{'ELEMENT':'bar'}}).
        andReturnSuccess(true).
        replayAll();

    var driver = testHelper.createDriver();
    var a = new webdriver.WebElement(driver, 'foo'),
        b = new webdriver.WebElement(driver, 'bar'),
        callback;

    webdriver.WebElement.equals(a, b).then(
        callback = callbackHelper(assertTrue));

    testHelper.execute();
    callback.assertCalled();
  }

  function testWaiting_waitSucceeds() {
    var testHelper = TestHelper.expectingSuccess().
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([]).
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([]).
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([{'ELEMENT':'bar'}]).
        replayAll();

    var driver = testHelper.createDriver();
    driver.wait(function() {
      return driver.isElementPresent(By.id('foo'));
    }, 200);
    testHelper.execute();
  }


  function testWaiting_waitTimesout() {
    var testHelper = TestHelper.
        expectingFailure(function(e) {
          assertEquals('Wait timed out after ',
              e.message.substring(0, 'Wait timed out after '.length));
        }).
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([]).
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([]).
        expect(CName.FIND_ELEMENTS, {'using':'id', 'value':'foo'}).
        andReturnSuccess([]).
        replayAll();

    var driver = testHelper.createDriver();
    driver.wait(function() {
      return driver.isElementPresent(By.id('foo'));
    }, 200);
    testHelper.execute();
  }

  function testInterceptsAndTransformsUnhandledAlertErrors() {
    var testHelper = TestHelper.
        expectingSuccess().
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
        andReturnError(ECode.MODAL_DIALOG_OPENED, {
          'message': 'boom',
          'alert': {'text': 'hello'}
        }).
        replayAll();

    var pair = callbackPair(null, function(e) {
      assertTrue(e instanceof webdriver.UnhandledAlertError);

      var pair = callbackPair(goog.partial(assertEquals, 'hello'));
      e.getAlert().getText().then(pair.callback, pair.errback);
      pair.assertCallback();
    });

    var driver = testHelper.createDriver();
    driver.findElement(By.id('foo')).then(pair.callback, pair.errback);
    testHelper.execute();
    pair.assertErrback();
  }

  function testUnhandledAlertErrors_usesEmptyStringIfAlertTextOmittedFromResponse() {
    var testHelper = TestHelper.
        expectingSuccess().
        expect(CName.FIND_ELEMENT, {'using':'id', 'value':'foo'}).
        andReturnError(ECode.MODAL_DIALOG_OPENED, {'message': 'boom'}).
        replayAll();

    var pair = callbackPair(null, function(e) {
      assertTrue(e instanceof webdriver.UnhandledAlertError);

      var pair = callbackPair(goog.partial(assertEquals, ''));
      e.getAlert().getText().then(pair.callback, pair.errback);
      pair.assertCallback();
    });

    var driver = testHelper.createDriver();
    driver.findElement(By.id('foo')).then(pair.callback, pair.errback);
    testHelper.execute();
    pair.assertErrback();
  }

  function testAlertHandleResolvesWhenPromisedTextResolves() {
    var text = new webdriver.promise.Deferred();

    var alert = new webdriver.Alert({}, text);
    assertTrue(alert.isPending());

    var callback, textCallback;
    webdriver.promise.when(alert,
        callback = callbackHelper(function(resolvedAlert) {
          assertEquals(alert, resolvedAlert);
          assertFalse(alert.getText().isPending());
        }));

    webdriver.promise.when(alert.getText(),
        textCallback = callbackHelper(function(text) {
          assertEquals('foo', text);
        }));

    callback.assertNotCalled();
    textCallback.assertNotCalled();

    text.resolve('foo');

    callback.assertCalled();
    textCallback.assertCalled();
    verifyAll();  // Make tearDown happy.
  }
  </script>
</body>
</html>
