| <!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> |