summaryrefslogtreecommitdiffstats
path: root/chrome/test/webdriver/webdriver_remote_tests.py
diff options
context:
space:
mode:
authorjmikhail@google.com <jmikhail@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-07 00:34:40 +0000
committerjmikhail@google.com <jmikhail@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-07 00:34:40 +0000
commit2cbc793935eaaf2c5f9adebd35e2e0b68c8fa7e7 (patch)
treed5cd14e9d8529c9b9a58b48917efe74d74ea8fe7 /chrome/test/webdriver/webdriver_remote_tests.py
parentea386f8632d042f1b4ce76109fecdb84df4a2abd (diff)
downloadchromium_src-2cbc793935eaaf2c5f9adebd35e2e0b68c8fa7e7.zip
chromium_src-2cbc793935eaaf2c5f9adebd35e2e0b68c8fa7e7.tar.gz
chromium_src-2cbc793935eaaf2c5f9adebd35e2e0b68c8fa7e7.tar.bz2
Adding modifications to allow chrome to naviagte to URLs.
This changelist includes the following URLs for the JSON protocol: /url /back /forward /refresh /title /source BUG=None TEST=webdriver_remote_tests.py Review URL: http://codereview.chromium.org/3338010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61747 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test/webdriver/webdriver_remote_tests.py')
-rw-r--r--chrome/test/webdriver/webdriver_remote_tests.py182
1 files changed, 182 insertions, 0 deletions
diff --git a/chrome/test/webdriver/webdriver_remote_tests.py b/chrome/test/webdriver/webdriver_remote_tests.py
new file mode 100644
index 0000000..d12cc3b
--- /dev/null
+++ b/chrome/test/webdriver/webdriver_remote_tests.py
@@ -0,0 +1,182 @@
+#!/usr/bin/python
+# Copyright (c) 2010 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+try:
+ import json
+except ImportError: # < 2.6
+ import simplejson as json
+
+import os
+import optparse
+import platform
+import string
+import subprocess
+import sys
+import time
+import unittest
+import urllib2
+from selenium.remote.webdriver import WebDriver
+from selenium.common.exceptions import ErrorInResponseException
+from urlparse import urlparse
+
+
+if sys.version_info < (2,6):
+ # Subprocess.Popen.kill is not available prior to 2.6.
+ if platform.system() == 'Windows':
+ import win32api
+ else:
+ import signal
+
+
+WEBDRIVER_EXE = os.path.abspath(os.path.join('.', 'chromedriver'))
+if platform.system() == 'Windows':
+ WEBDRIVER_EXE = '%s.exe' % WEBDRIVER_EXE
+WEBDRIVER_PORT = 8080
+WEBDRIVER_SERVER_URL = None
+WEBDRIVER_PROCESS = None
+
+if not WEBDRIVER_SERVER_URL:
+ WEBDRIVER_SERVER_URL = 'http://localhost:%d' % WEBDRIVER_PORT
+
+class TestNavigation(unittest.TestCase):
+
+ SEARCH = "http://www.google.com/webhp?hl=en"
+ NEWS = "http://www.google.com/news?hl=en"
+
+ """A new instance of chrome driver is started for every test case"""
+ def setUp(self):
+ global WEBDRIVER_SERVER_URL
+ global WEBDRIVER_PROCESS
+ WEBDRIVER_PROCESS = subprocess.Popen([WEBDRIVER_EXE,
+ '--port=%d' % WEBDRIVER_PORT])
+ if WEBDRIVER_PROCESS == None:
+ print "Chromium executable not found. The path used was: "
+ print WEBDRIVER_EXE
+ sys.exit(-1)
+
+ time.sleep(5)
+ self.driver = WebDriver.WebDriver(WEBDRIVER_SERVER_URL, "chrome", "ANY");
+ self.assertTrue(self.driver)
+
+ def tearDown(self):
+ global WEBDRIVER_PROCESS
+ self.driver.quit()
+ if WEBDRIVER_PROCESS:
+ if sys.version_info < (2,6):
+ # From http://stackoverflow.com/questions/1064335
+ if platform.system() == 'Windows':
+ PROCESS_TERMINATE = 1
+ handle = win32api.OpenProcess(PROCESS_TERMINATE, False,
+ WEBDRIVER_PROCESS.pid)
+ win32api.TerminateProcess(handle, -1)
+ win32api.CloseHandle(handle)
+ else:
+ os.kill(WEBDRIVER_PROCESS.pid, signal.SIGKILL)
+ else:
+ WEBDRIVER_PROCESS.kill()
+ WEBDRIVER_PROCESS = None
+
+ """Verifies that navigation to a specific page is correct by asserting on the
+ the reported URL. The function will not work with pages that redirect."""
+ def navigate(self, url):
+ self.driver.get(url)
+ self.assertURL(url)
+
+ def assertURL(self, url):
+ u = self.driver.get_current_url()
+ self.assertEqual(u, url)
+
+ """Preforms a string search ignoring case"""
+ def assertFind(self, text, search):
+ text = string.lower(text)
+ search = string.lower(search)
+ self.assertNotEqual(-1, string.find(text, search))
+
+ def testNavigateToURL(self):
+ # No redirects are allowed on the google home page.
+ self.navigate(self.SEARCH)
+
+ def testGoBackWithNoHistory(self):
+ # Go back one page with nothing to go back to.
+ self.assertRaises(ErrorInResponseException, self.driver.back)
+
+ def testGoForwardWithNoHistory(self):
+ # Go forward with nothing to move forward to.
+ self.assertRaises(ErrorInResponseException, self.driver.forward)
+
+ def testNavigation(self):
+ # Loads two pages into chrome's navigation history.
+ self.navigate(self.NEWS)
+ self.navigate(self.SEARCH)
+
+ # Go back to news.
+ self.driver.back();
+ self.assertURL(self.NEWS)
+
+ # Move forward to search.
+ self.driver.forward()
+ self.assertURL(self.SEARCH)
+
+ # Verify refresh keeps us on the current page.
+ self.driver.refresh()
+ self.assertURL(self.SEARCH)
+
+ # Go back to the previous URL and refresh making sure
+ # we dont change the page.
+ self.driver.back()
+ self.assertURL(self.NEWS)
+ self.driver.refresh()
+ self.assertURL(self.NEWS)
+
+ def testGetTitle(self):
+ self.navigate(self.SEARCH)
+ title = self.driver.get_title()
+ # The google name must always be in the search title.
+ self.assertFind(title, u"google")
+
+ def testGetSource(self):
+ self.navigate(self.SEARCH)
+ source = self.driver.get_page_source()
+ self.assertFind(source, u"document.body.style") # Basic javascript.
+ self.assertFind(source, u"feeling lucky") # Lucky button.
+ self.assertFind(source, u"google search") # Searh button.
+
+if __name__ == '__main__':
+ parser = optparse.OptionParser('%prog [options]')
+ parser.add_option('-u', '--url', dest='url', action='store',
+ type='string', default=None,
+ help=('Specifies the URL of a remote WebDriver server to '
+ 'test against. If not specified, a server will be '
+ 'started on localhost according to the --exe and '
+ '--port flags'))
+ parser.add_option('-e', '--exe', dest='exe', action='store',
+ type='string', default=None,
+ help=('Path to the WebDriver server executable that should '
+ 'be started for testing; This flag is ignored if '
+ '--url is provided for a remote server.'))
+ parser.add_option('-p', '--port', dest='port', action='store',
+ type='int', default=8080,
+ help=('The port to start the WebDriver server executable '
+ 'on; This flag is ignored if --url is provided for a '
+ 'remote server.'))
+
+ (options, args) = parser.parse_args()
+ # Strip out our flags so unittest.main() correct parses the remaining.
+ sys.argv = sys.argv[:1]
+ sys.argv.extend(args)
+
+ if options.url:
+ WEBDRIVER_SERVER_URL = options.url
+ else:
+ if options.port:
+ WEBDRIVER_PORT = options.port
+ if options.exe:
+ WEBDRIVER_EXE = options.exe
+ if not os.path.exists(WEBDRIVER_EXE):
+ parser.error('WebDriver server executable not found:\n\t%s\n'
+ 'Please specify a valid path with the --exe flag.'
+ % WEBDRIVER_EXE)
+
+ unittest.main()