| #!/usr/bin/python |
| |
| # Copyright 2008-2010 WebDriver committers |
| # Copyright 2008-2010 Google Inc. |
| # |
| # 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. |
| |
| |
| import unittest |
| from selenium.webdriver.remote.webelement import WebElement |
| |
| |
| class ExecutingJavaScriptTests(unittest.TestCase): |
| |
| def testShouldBeAbleToExecuteSimpleJavascriptAndReturnAString(self): |
| self._loadPage("xhtmlTest") |
| |
| result = self.driver.execute_script("return document.title") |
| |
| self.assertTrue(type(result) == unicode or type(result) == str, |
| "The type of the result is " + str(type(result))) |
| self.assertEqual("XHTML Test Page", result) |
| |
| |
| def testShouldBeAbleToExecuteSimpleJavascriptAndReturnAnInteger(self): |
| self._loadPage("nestedElements") |
| result = self.driver.execute_script("return document.getElementsByName('checky').length") |
| |
| self.assertTrue(type(result) == int) |
| self.assertTrue(long(result) > 1) |
| |
| |
| #@Ignore(SELENESE) |
| def testShouldBeAbleToExecuteSimpleJavascriptAndReturnAWebElement(self): |
| self._loadPage("xhtmlTest") |
| |
| result = self.driver.execute_script("return document.getElementById('id1')") |
| |
| self.assertTrue(result is not None) |
| self.assertTrue(type(result) == WebElement) |
| self.assertEqual("a", result.tag_name.lower()) |
| |
| |
| def testShouldBeAbleToExecuteSimpleJavascriptAndReturnABoolean(self): |
| self._loadPage("xhtmlTest") |
| |
| result = self.driver.execute_script("return true") |
| |
| self.assertTrue(result is not None) |
| self.assertTrue(type(result) == bool) |
| self.assertTrue(bool(result)) |
| |
| |
| #@Ignore(SELENESE, IPHONE) |
| def testShouldBeAbleToExecuteSimpleJavascriptAndAStringsArray(self): |
| self._loadPage("javascriptPage") |
| expectedResult = [] |
| expectedResult.append("zero") |
| expectedResult.append("one") |
| expectedResult.append("two") |
| result = self.driver.execute_script( |
| "return ['zero', 'one', 'two']") |
| |
| self.assertEqual(expectedResult, result) |
| |
| #@Ignore(SELENESE, IPHONE) |
| def testShouldBeAbleToExecuteSimpleJavascriptAndReturnAnArray(self): |
| self._loadPage("javascriptPage") |
| expectedResult = [] |
| expectedResult.append("zero") |
| subList = [] |
| subList.append(True) |
| subList.append(False) |
| expectedResult.append(subList) |
| result = self.driver.execute_script("return ['zero', [true, false]]") |
| self.assertTrue(result is not None) |
| self.assertTrue(type(result) == list) |
| self.assertTrue(expectedResult, result) |
| |
| def testPassingAndReturningALongShouldReturnAWholeNumber(self): |
| self._loadPage("javascriptPage") |
| expectedResult = 1L |
| result = self.driver.execute_script("return arguments[0]", expectedResult) |
| self.assertTrue((type(result) == int or type(result) == long)) |
| self.assertEqual(expectedResult, result) |
| |
| |
| def testPassingAndReturningADoubleShouldReturnADecimal(self): |
| self._loadPage("javascriptPage") |
| expectedResult = 1.2 |
| result = self.driver.execute_script("return arguments[0]", expectedResult) |
| self.assertTrue( type(result) == float) |
| self.assertEqual(expectedResult, result) |
| |
| def testShouldThrowAnExceptionWhenTheJavascriptIsBad(self): |
| self._loadPage("xhtmlTest") |
| |
| try: |
| self.driver.execute_script("return squiggle()") |
| self.fail("Expected an exception") |
| except Exception, e: |
| pass |
| |
| |
| def testShouldBeAbleToCallFunctionsDefinedOnThePage(self): |
| self._loadPage("javascriptPage") |
| self.driver.execute_script("displayMessage('I like cheese')") |
| text = self.driver.find_element_by_id("result").text |
| |
| self.assertEqual("I like cheese", text.strip()) |
| |
| def testShouldBeAbleToPassAStringAnAsArgument(self): |
| self._loadPage("javascriptPage") |
| value = self.driver.execute_script( |
| "return arguments[0] == 'fish' ? 'fish' : 'not fish'", "fish") |
| |
| self.assertEqual("fish", value) |
| |
| |
| def testShouldBeAbleToPassABooleanAnAsArgument(self): |
| self._loadPage("javascriptPage") |
| value = bool(self.driver.execute_script("return arguments[0] == true", True)) |
| |
| self.assertTrue(value) |
| |
| def testShouldBeAbleToPassANumberAnAsArgument(self): |
| self._loadPage("javascriptPage") |
| value = bool(self.driver.execute_script("return arguments[0] == 1 ? true : false", 1)) |
| |
| self.assertTrue(value) |
| |
| def testShouldBeAbleToPassAWebElementAsArgument(self): |
| self._loadPage("javascriptPage") |
| button = self.driver.find_element_by_id("plainButton") |
| value = self.driver.execute_script( |
| "arguments[0]['flibble'] = arguments[0].getAttribute('id'); return arguments[0]['flibble']", |
| button) |
| |
| self.assertEqual("plainButton", value) |
| |
| def testShouldBeAbleToPassAnArrayAsArgument(self): |
| self._loadPage("javascriptPage") |
| array = ["zero", 1, True, 3.14159] |
| length = long(self.driver.execute_script("return arguments[0].length", array)) |
| self.assertEqual(len(array), length) |
| |
| |
| def testShouldBeAbleToPassACollectionAsArgument(self): |
| self._loadPage("javascriptPage") |
| collection = [] |
| collection.append("Cheddar") |
| collection.append("Brie") |
| collection.append(7) |
| length = long(self.driver.execute_script("return arguments[0].length", collection)) |
| self.assertEqual(len(collection), length) |
| |
| collection = [] |
| collection.append("Gouda") |
| collection.append("Stilton") |
| collection.append("Stilton") |
| collection.append(True) |
| length = long(self.driver.execute_script("return arguments[0].length", collection)) |
| self.assertEqual(len(collection), length) |
| |
| def testShouldThrowAnExceptionIfAnArgumentIsNotValid(self): |
| self._loadPage("javascriptPage") |
| try: |
| self.driver.execute_script("return arguments[0]", driver) |
| self.fail("Exception should have been thrown") |
| except Exception, e: |
| pass |
| |
| def testShouldBeAbleToPassInMoreThanOneArgument(self): |
| self._loadPage("javascriptPage") |
| result = self.driver.execute_script("return arguments[0] + arguments[1]", "one", "two") |
| |
| self.assertEqual("onetwo", result) |
| |
| def testJavascriptStringHandlingShouldWorkAsExpected(self): |
| self._loadPage("javascriptPage") |
| |
| value = self.driver.execute_script("return ''") |
| self.assertEqual("", value) |
| |
| value = self.driver.execute_script("return undefined") |
| self.assertTrue(value is None) |
| |
| value = self.driver.execute_script("return ' '") |
| self.assertEqual(" ", value) |
| |
| def testShouldBeAbleToCreateAPersistentValue(self): |
| self._loadPage("formPage") |
| |
| self.driver.execute_script("document.alerts = []") |
| self.driver.execute_script("document.alerts.push('hello world')") |
| text = self.driver.execute_script("return document.alerts.shift()") |
| |
| self.assertEqual("hello world", text) |
| |
| def testCanPassADictionaryAsAParameter(self): |
| self._loadSimplePage() |
| nums = [1, 2] |
| args = {"bar": "test", "foo": nums} |
| |
| |
| res = self.driver.execute_script("return arguments[0]['foo'][1]", args); |
| |
| self.assertEqual(2, res) |
| |
| def _pageURL(self, name): |
| return "http://localhost:%d/%s.html" % (self.webserver.port, name) |
| |
| def _loadSimplePage(self): |
| self._loadPage("simpleTest") |
| |
| def _loadPage(self, name): |
| self.driver.get(self._pageURL(name)) |