Index: chrome/test/webdriver/test/chromedriver_tests.py |
diff --git a/chrome/test/webdriver/test/chromedriver_tests.py b/chrome/test/webdriver/test/chromedriver_tests.py |
deleted file mode 100644 |
index 5402216980d006870fea205a8733de6f3e15aabf..0000000000000000000000000000000000000000 |
--- a/chrome/test/webdriver/test/chromedriver_tests.py |
+++ /dev/null |
@@ -1,1225 +0,0 @@ |
-# Copyright (c) 2012 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. |
- |
-"""Tests for ChromeDriver. |
- |
-If your test is testing a specific part of the WebDriver API, consider adding |
-it to the appropriate place in the WebDriver tree instead. |
-""" |
- |
-import binascii |
-from distutils import archive_util |
-import hashlib |
-import httplib |
-import os |
-import platform |
-import signal |
-import subprocess |
-import sys |
-import tempfile |
-import threading |
-import time |
-import unittest |
-import urllib |
-import urllib2 |
-import urlparse |
- |
-from chromedriver_factory import ChromeDriverFactory |
-from chromedriver_launcher import ChromeDriverLauncher |
-from chromedriver_test import ChromeDriverTest |
-import test_paths |
-import util |
- |
-try: |
- import simplejson as json |
-except ImportError: |
- import json |
- |
-from selenium.common.exceptions import NoSuchWindowException |
-from selenium.common.exceptions import WebDriverException |
-from selenium.webdriver.common.action_chains import ActionChains |
-from selenium.webdriver.common.desired_capabilities import DesiredCapabilities |
-from selenium.webdriver.common.keys import Keys |
-from selenium.webdriver.remote.command import Command |
-from selenium.webdriver.remote.webdriver import WebDriver |
-from selenium.webdriver.support.ui import WebDriverWait |
- |
- |
-def SkipIf(should_skip): |
- """Decorator which allows skipping individual test cases.""" |
- if should_skip: |
- return lambda func: None |
- return lambda func: func |
- |
- |
-class Request(urllib2.Request): |
- """Extends urllib2.Request to support all HTTP request types.""" |
- |
- def __init__(self, url, method=None, data=None): |
- """Initialise a new HTTP request. |
- |
- Arguments: |
- url: The full URL to send the request to. |
- method: The HTTP request method to use; defaults to 'GET'. |
- data: The data to send with the request as a string. Defaults to |
- None and is ignored if |method| is not 'POST' or 'PUT'. |
- """ |
- if method is None: |
- method = data is not None and 'POST' or 'GET' |
- elif method not in ('POST', 'PUT'): |
- data = None |
- self.method = method |
- urllib2.Request.__init__(self, url, data=data) |
- |
- def get_method(self): |
- """Returns the HTTP method used by this request.""" |
- return self.method |
- |
- |
-def SendRequest(url, method=None, data=None): |
- """Sends a HTTP request to the WebDriver server. |
- |
- Return values and exceptions raised are the same as those of |
- |urllib2.urlopen|. |
- |
- Arguments: |
- url: The full URL to send the request to. |
- method: The HTTP request method to use; defaults to 'GET'. |
- data: The data to send with the request as a string. Defaults to |
- None and is ignored if |method| is not 'POST' or 'PUT'. |
- |
- Returns: |
- A file-like object. |
- """ |
- request = Request(url, method=method, data=data) |
- request.add_header('Accept', 'application/json') |
- opener = urllib2.build_opener(urllib2.HTTPRedirectHandler()) |
- return opener.open(request) |
- |
- |
-class BasicTest(ChromeDriverTest): |
- """Basic ChromeDriver tests.""" |
- |
- def setUp(self): |
- self._server2 = ChromeDriverLauncher(self.GetDriverPath()).Launch() |
- |
- def tearDown(self): |
- self._server2.Kill() |
- |
- def testShouldReturn403WhenSentAnUnknownCommandURL(self): |
- request_url = self._server2.GetUrl() + '/foo' |
- try: |
- SendRequest(request_url, method='GET') |
- self.fail('Should have raised a urllib.HTTPError for returned 403') |
- except urllib2.HTTPError, expected: |
- self.assertEquals(403, expected.code) |
- |
- def testShouldReturnHTTP405WhenSendingANonPostToTheSessionURL(self): |
- request_url = self._server2.GetUrl() + '/session' |
- try: |
- SendRequest(request_url, method='GET') |
- self.fail('Should have raised a urllib.HTTPError for returned 405') |
- except urllib2.HTTPError, expected: |
- self.assertEquals(405, expected.code) |
- self.assertEquals('POST', expected.hdrs['Allow']) |
- |
- def testShouldGetA404WhenAttemptingToDeleteAnUnknownSession(self): |
- request_url = self._server2.GetUrl() + '/session/unkown_session_id' |
- try: |
- SendRequest(request_url, method='DELETE') |
- self.fail('Should have raised a urllib.HTTPError for returned 404') |
- except urllib2.HTTPError, expected: |
- self.assertEquals(404, expected.code) |
- |
- def testShouldReturn204ForFaviconRequests(self): |
- request_url = self._server2.GetUrl() + '/favicon.ico' |
- # In python2.5, a 204 status code causes an exception. |
- if sys.version_info[0:2] == (2, 5): |
- try: |
- SendRequest(request_url, method='GET') |
- self.fail('Should have raised a urllib.HTTPError for returned 204') |
- except urllib2.HTTPError, expected: |
- self.assertEquals(204, expected.code) |
- else: |
- response = SendRequest(request_url, method='GET') |
- try: |
- self.assertEquals(204, response.code) |
- finally: |
- response.close() |
- |
- def testCreatingSessionShouldRedirectToCorrectURL(self): |
- request_url = self._server2.GetUrl() + '/session' |
- response = SendRequest(request_url, method='POST', |
- data='{"desiredCapabilities": {}}') |
- self.assertEquals(200, response.code) |
- self.session_url = response.geturl() # TODO(jleyba): verify this URL? |
- |
- data = json.loads(response.read()) |
- self.assertTrue(isinstance(data, dict)) |
- self.assertEquals(0, data['status']) |
- |
- url_parts = urlparse.urlparse(self.session_url)[2].split('/') |
- self.assertEquals(3, len(url_parts)) |
- self.assertEquals('', url_parts[0]) |
- self.assertEquals('session', url_parts[1]) |
- self.assertEquals(data['sessionId'], url_parts[2]) |
- |
- |
-class WebserverTest(ChromeDriverTest): |
- """Tests the built-in ChromeDriver webserver.""" |
- |
- def testShouldNotServeFilesByDefault(self): |
- server = ChromeDriverLauncher(self.GetDriverPath()).Launch() |
- try: |
- SendRequest(server.GetUrl(), method='GET') |
- self.fail('Should have raised a urllib.HTTPError for returned 403') |
- except urllib2.HTTPError, expected: |
- self.assertEquals(403, expected.code) |
- finally: |
- server.Kill() |
- |
- def testCanServeFiles(self): |
- launcher = ChromeDriverLauncher(self.GetDriverPath(), |
- root_path=os.path.dirname(__file__)) |
- server = launcher.Launch() |
- request_url = server.GetUrl() + '/' + os.path.basename(__file__) |
- SendRequest(request_url, method='GET') |
- server.Kill() |
- |
- |
-class DesiredCapabilitiesTest(ChromeDriverTest): |
- """Tests for webdriver desired capabilities.""" |
- |
- def testCustomSwitches(self): |
- switches = ['enable-file-cookie'] |
- capabilities = {'chrome.switches': switches} |
- |
- driver = self.GetNewDriver(capabilities) |
- driver.get('about:version') |
- self.assertNotEqual(-1, driver.page_source.find('enable-file-cookie')) |
- driver.quit() |
- |
- def testBinary(self): |
- self.GetNewDriver({'chrome.binary': self.GetChromePath()}) |
- |
- def testUserProfile(self): |
- """Test starting WebDriver session with custom profile.""" |
- |
- # Open a new session and save the user profile. |
- profile_dir = tempfile.mkdtemp() |
- capabilities = {'chrome.switches': ['--user-data-dir=' + profile_dir]} |
- driver = self.GetNewDriver(capabilities) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- # Create a cookie. |
- cookie_dict = {} |
- cookie_dict['name'] = 'test_user_profile' |
- cookie_dict['value'] = 'chrome profile' |
- cookie_dict['expiry'] = time.time() + 120 |
- driver.add_cookie(cookie_dict) |
- driver.quit() |
- |
- profile_zip = archive_util.make_archive(os.path.join(profile_dir, |
- 'profile'), |
- 'zip', |
- root_dir=profile_dir, |
- base_dir='Default') |
- f = open(profile_zip, 'rb') |
- base64_user_profile = binascii.b2a_base64(f.read()).strip() |
- f.close() |
- os.remove(profile_zip) |
- |
- # Start new session with the saved user profile. |
- capabilities = {'chrome.profile': base64_user_profile} |
- driver = self.GetNewDriver(capabilities) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- cookie_dict = driver.get_cookie('test_user_profile') |
- self.assertNotEqual(cookie_dict, None) |
- self.assertEqual(cookie_dict['value'], 'chrome profile') |
- driver.quit() |
- |
- def testInstallExtensions(self): |
- """Test starting web driver with multiple extensions.""" |
- extensions = ['ext_test_1.crx', 'ext_test_2.crx'] |
- base64_extensions = [] |
- for ext in extensions: |
- f = open(test_paths.GetTestDataPath(ext), 'rb') |
- base64_ext = (binascii.b2a_base64(f.read()).strip()) |
- base64_extensions.append(base64_ext) |
- f.close() |
- capabilities = {'chrome.extensions': base64_extensions} |
- driver = self.GetNewDriver(capabilities) |
- extension_names = [x.get_name() for x in driver.get_installed_extensions()] |
- self.assertEquals(2, len(extension_names)) |
- self.assertTrue('ExtTest1' in extension_names) |
- self.assertTrue('ExtTest2' in extension_names) |
- driver.quit() |
- |
- def testPrefs(self): |
- """Test that chromedriver can set user preferences.""" |
- driver = self.GetNewDriver({ |
- 'chrome.noWebsiteTestingDefaults': True, |
- 'chrome.prefs': { |
- 'profile.default_content_settings': { |
- 'popups': 1 |
- }, |
- } |
- }) |
- driver.get(self.GetTestDataUrl() + '/empty.html') |
- driver.execute_script('window.open("about:blank")') |
- self.assertEquals(2, len(driver.window_handles)) |
- |
- def testLoadAsync(self): |
- """Test that chromedriver can load pages asynchronously.""" |
- driver = self.GetNewDriver({'chrome.loadAsync': True}) |
- |
- # Check that navigate doesn't wait for the page to load. |
- driver.get(self.GetTestDataUrl() + '/hang') |
- |
- # Check that the navigation actually starts. |
- def IsEmptyPage(driver): |
- return driver.current_url.endswith('empty.html') |
- driver.get(self.GetTestDataUrl() + '/empty.html') |
- WebDriverWait(driver, 10).until(IsEmptyPage) |
- |
- |
-class DetachProcessTest(ChromeDriverTest): |
- |
- def setUp(self): |
- self._server2 = ChromeDriverLauncher(self.GetDriverPath()).Launch() |
- self._factory2 = ChromeDriverFactory(self._server2) |
- |
- def tearDown(self): |
- self._server2.Kill() |
- |
- # TODO(kkania): Remove this when Chrome 15 is stable. |
- # crbug.com/134982 |
- def DISABLED_testDetachProcess(self): |
- # This is a weak test. Its purpose is to just make sure we can start |
- # Chrome successfully in detached mode. There's not an easy way to know |
- # if Chrome is shutting down due to the channel error when the client |
- # disconnects. |
- driver = self._factory2.GetNewDriver({'chrome.detach': True}) |
- driver.get('about:memory') |
- pid = int(driver.find_elements_by_xpath('//*[@jscontent="pid"]')[0].text) |
- self._server2.Kill() |
- try: |
- util.Kill(pid) |
- except OSError: |
- self.fail('Chrome quit after detached chromedriver server was killed') |
- |
- |
-class CookieTest(ChromeDriverTest): |
- """Cookie test for the json webdriver protocol""" |
- |
- def testAddCookie(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- cookie_dict = None |
- cookie_dict = driver.get_cookie("chromedriver_cookie_test") |
- cookie_dict = {} |
- cookie_dict["name"] = "chromedriver_cookie_test" |
- cookie_dict["value"] = "this is a test" |
- driver.add_cookie(cookie_dict) |
- cookie_dict = driver.get_cookie("chromedriver_cookie_test") |
- self.assertNotEqual(cookie_dict, None) |
- self.assertEqual(cookie_dict["value"], "this is a test") |
- |
- def testDeleteCookie(self): |
- driver = self.GetNewDriver() |
- self.testAddCookie(); |
- driver.delete_cookie("chromedriver_cookie_test") |
- cookie_dict = driver.get_cookie("chromedriver_cookie_test") |
- self.assertEqual(cookie_dict, None) |
- |
- |
-class ScreenshotTest(ChromeDriverTest): |
- """Tests to verify screenshot retrieval""" |
- |
- REDBOX = "automation_proxy_snapshot/set_size.html" |
- |
- def testScreenCaptureAgainstReference(self): |
- # Create a red square of 2000x2000 pixels. |
- url = util.GetFileURLForPath(test_paths.GetChromeTestDataPath(self.REDBOX)) |
- url += '?2000,2000' |
- driver = self.GetNewDriver() |
- driver.get(url) |
- s = driver.get_screenshot_as_base64() |
- h = hashlib.md5(s).hexdigest() |
- # Compare the PNG created to the reference hash. |
- self.assertEquals(h, '12c0ade27e3875da3d8866f52d2fa84f') |
- |
- # This test requires Flash and must be run on a VM or via remote desktop. |
- # See crbug.com/96317. |
- def testSnapshotWithWindowlessFlashAndTransparentOverlay(self): |
- if not util.IsWin(): |
- return |
- |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/plugin_transparency_test.html') |
- snapshot = driver.get_screenshot_as_base64() |
- self.assertEquals(hashlib.md5(snapshot).hexdigest(), |
- '72e5b8525e48758bae59997472f27f14') |
- |
- |
-class SessionTest(ChromeDriverTest): |
- """Tests dealing with WebDriver sessions.""" |
- |
- def testShouldBeGivenCapabilitiesWhenStartingASession(self): |
- driver = self.GetNewDriver() |
- capabilities = driver.capabilities |
- |
- self.assertEquals('chrome', capabilities['browserName']) |
- self.assertTrue(capabilities['javascriptEnabled']) |
- self.assertTrue(capabilities['takesScreenshot']) |
- self.assertTrue(capabilities['cssSelectorsEnabled']) |
- |
- # Value depends on what version the server is starting. |
- self.assertTrue('version' in capabilities) |
- self.assertTrue( |
- isinstance(capabilities['version'], unicode), |
- 'Expected a %s, but was %s' % (unicode, |
- type(capabilities['version']))) |
- |
- system = platform.system() |
- if system == 'Linux': |
- self.assertEquals('linux', capabilities['platform'].lower()) |
- elif system == 'Windows': |
- self.assertEquals('windows', capabilities['platform'].lower()) |
- elif system == 'Darwin': |
- self.assertEquals('mac', capabilities['platform'].lower()) |
- else: |
- # No python on ChromeOS, so we won't have a platform value, but |
- # the server will know and return the value accordingly. |
- self.assertEquals('chromeos', capabilities['platform'].lower()) |
- |
- def testSessionCreationDeletion(self): |
- self.GetNewDriver().quit() |
- |
- # crbug.com/103396 |
- def DISABLED_testMultipleSessionCreationDeletion(self): |
- for i in range(10): |
- self.GetNewDriver().quit() |
- |
- def testSessionCommandsAfterSessionDeletionReturn404(self): |
- driver = self.GetNewDriver() |
- url = self.GetTestDataUrl() |
- url += '/session/' + driver.session_id |
- driver.quit() |
- try: |
- response = SendRequest(url, method='GET') |
- self.fail('Should have thrown 404 exception') |
- except urllib2.HTTPError, expected: |
- self.assertEquals(404, expected.code) |
- |
- def testMultipleConcurrentSessions(self): |
- drivers = [] |
- for i in range(10): |
- drivers += [self.GetNewDriver()] |
- for driver in drivers: |
- driver.quit() |
- |
- |
-class ShutdownTest(ChromeDriverTest): |
- |
- def setUp(self): |
- super(ShutdownTest, self).setUp() |
- self._custom_server = ChromeDriverLauncher(self.GetDriverPath()).Launch() |
- self._custom_factory = ChromeDriverFactory(self._custom_server, |
- self.GetChromePath()) |
- |
- def tearDown(self): |
- self._custom_server.Kill() |
- super(ShutdownTest, self).tearDown() |
- |
- def testShutdownWithSession(self): |
- driver = self._custom_factory.GetNewDriver() |
- driver.get(self._custom_server.GetUrl() + '/status') |
- driver.find_element_by_tag_name('body') |
- self._custom_server.Kill() |
- |
- def testShutdownWithBusySession(self): |
- def _Hang(driver): |
- """Waits for the process to quit and then notifies.""" |
- try: |
- driver.get(self._custom_server.GetUrl() + '/hang') |
- except httplib.BadStatusLine: |
- pass |
- |
- driver = self._custom_factory.GetNewDriver() |
- wait_thread = threading.Thread(target=_Hang, args=(driver,)) |
- wait_thread.start() |
- wait_thread.join(5) |
- self.assertTrue(wait_thread.isAlive()) |
- |
- self._custom_server.Kill() |
- wait_thread.join(10) |
- self.assertFalse(wait_thread.isAlive()) |
- |
- |
-class MouseTest(ChromeDriverTest): |
- """Mouse command tests for the json webdriver protocol""" |
- |
- def setUp(self): |
- super(MouseTest, self).setUp() |
- self._driver = self.GetNewDriver() |
- |
- def testCanClickTransparentElement(self): |
- self._driver.get(self.GetTestDataUrl() + '/transparent.html') |
- self._driver.find_element_by_tag_name('a').click() |
- self.assertTrue(self._driver.execute_script('return window.success')) |
- |
- # crbug.com/136875 |
- def DISABLED_testClickElementThatNeedsContainerScrolling(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- self._driver.find_element_by_name('hidden_scroll').click() |
- self.assertTrue(self._driver.execute_script('return window.success')) |
- |
- # crbug.com/136875 |
- def DISABLED_testClickElementThatNeedsIframeScrolling(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- self._driver.switch_to_frame('iframe') |
- self._driver.find_element_by_name('hidden_scroll').click() |
- self.assertTrue(self._driver.execute_script('return window.success')) |
- |
- def testClickElementThatNeedsPageScrolling(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- self._driver.find_element_by_name('far_away').click() |
- self.assertTrue(self._driver.execute_script('return window.success')) |
- |
- # TODO(kkania): Move this test to the webdriver repo. |
- def testClickDoesSelectOption(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- option = self._driver.find_element_by_name('option') |
- self.assertFalse(option.is_selected()) |
- option.click() |
- self.assertTrue(option.is_selected()) |
- |
- def testClickDoesUseFirstClientRect(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- self._driver.find_element_by_name('wrapped').click() |
- self.assertTrue(self._driver.execute_script('return window.success')) |
- |
- def testThrowErrorIfNotClickable(self): |
- self._driver.get(self.GetTestDataUrl() + '/not_clickable.html') |
- elem = self._driver.find_element_by_name('click') |
- self.assertRaises(WebDriverException, elem.click) |
- |
- |
-# crbug.com/109698: when running in xvfb, 2 extra mouse moves are received. |
-# crbug.com/138125: fails if the mouse cursor is left over the page. |
-@SkipIf(True) |
-class MouseEventTest(ChromeDriverTest): |
- """Tests for checking the correctness of mouse events.""" |
- |
- def setUp(self): |
- super(MouseEventTest, self).setUp() |
- self._driver = self.GetNewDriver() |
- ActionChains(self._driver).key_down([Keys.CONTROL, Keys.SHIFT]).perform() |
- self._driver.get(self.GetTestDataUrl() + '/events.html') |
- self._divs = self._driver.find_elements_by_tag_name('div') |
- |
- def _CheckEvent(self, event, event_type, mouse_button, x, y): |
- """Checks the given event properties. |
- |
- This function expects the ctrl and shift keys to be pressed. |
- """ |
- self.assertEquals(event_type, event['type']) |
- self.assertEquals(mouse_button, event['button']) |
- self.assertEquals(False, event['altKey']) |
- self.assertEquals(True, event['ctrlKey']) |
- self.assertEquals(True, event['shiftKey']) |
- self.assertEquals(x, event['x']) |
- self.assertEquals(y, event['y']) |
- |
- def _GetElementMiddle(self, elem): |
- x = elem.location['x'] |
- y = elem.location['y'] |
- return (x + (elem.size['width'] + 1) / 2, y + (elem.size['height'] + 1) / 2) |
- |
- def testMoveCommand(self): |
- x = self._divs[0].location['x'] |
- y = self._divs[0].location['y'] |
- center_x, center_y = self._GetElementMiddle(self._divs[0]) |
- |
- # Move to element. |
- ActionChains(self._driver).move_to_element(self._divs[0]).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(1, len(events)) |
- self._CheckEvent(events[0], 'mousemove', 0, center_x, center_y) |
- |
- # Move by offset. |
- ActionChains(self._driver).move_by_offset(1, 2).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(1, len(events)) |
- self._CheckEvent(events[0], 'mousemove', 0, center_x + 1, center_y + 2) |
- |
- # Move to element and offset. |
- ActionChains(self._driver).move_to_element_with_offset( |
- self._divs[0], 2, 1).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(1, len(events)) |
- self._CheckEvent(events[0], 'mousemove', 0, x + 2, y + 1) |
- |
- def testClickCommand(self): |
- center_x, center_y = self._GetElementMiddle(self._divs[0]) |
- |
- # Left click element. |
- ActionChains(self._driver).click(self._divs[0]).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(3, len(events)) |
- self._CheckEvent(events[0], 'mousemove', 0, center_x, center_y) |
- self._CheckEvent(events[1], 'mousedown', 0, center_x, center_y) |
- self._CheckEvent(events[2], 'mouseup', 0, center_x, center_y) |
- |
- # Left click. |
- ActionChains(self._driver).click(None).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(2, len(events)) |
- self._CheckEvent(events[0], 'mousedown', 0, center_x, center_y) |
- self._CheckEvent(events[1], 'mouseup', 0, center_x, center_y) |
- |
- # Right click. |
- ActionChains(self._driver).context_click(None).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(2, len(events)) |
- self._CheckEvent(events[0], 'mousedown', 2, center_x, center_y) |
- self._CheckEvent(events[1], 'mouseup', 2, center_x, center_y) |
- |
- def testButtonDownUpCommand(self): |
- center_x, center_y = self._GetElementMiddle(self._divs[0]) |
- center_x2, center_y2 = self._GetElementMiddle(self._divs[1]) |
- |
- # Press and release element. |
- ActionChains(self._driver).click_and_hold(self._divs[0]).release( |
- self._divs[1]).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(4, len(events)) |
- self._CheckEvent(events[0], 'mousemove', 0, center_x, center_y) |
- self._CheckEvent(events[1], 'mousedown', 0, center_x, center_y) |
- self._CheckEvent(events[2], 'mousemove', 0, center_x2, center_y2) |
- self._CheckEvent(events[3], 'mouseup', 0, center_x2, center_y2) |
- |
- # Press and release. |
- ActionChains(self._driver).click_and_hold(None).release(None).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(2, len(events)) |
- self._CheckEvent(events[0], 'mousedown', 0, center_x2, center_y2) |
- self._CheckEvent(events[1], 'mouseup', 0, center_x2, center_y2) |
- |
- def testDoubleClickCommand(self): |
- center_x, center_y = self._GetElementMiddle(self._divs[0]) |
- |
- # Double click element. |
- ActionChains(self._driver).double_click(self._divs[0]).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(6, len(events)) |
- self._CheckEvent(events[5], 'dblclick', 0, center_x, center_y) |
- |
- # Double click. |
- ActionChains(self._driver).double_click(None).perform() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(5, len(events)) |
- self._CheckEvent(events[4], 'dblclick', 0, center_x, center_y) |
- |
- def testElementAPIClick(self): |
- center_x, center_y = self._GetElementMiddle(self._divs[0]) |
- |
- # Left click element. |
- self._divs[0].click() |
- events = self._driver.execute_script('return takeEvents()') |
- self.assertEquals(3, len(events)) |
- self._CheckEvent(events[0], 'mousemove', 0, center_x, center_y) |
- self._CheckEvent(events[1], 'mousedown', 0, center_x, center_y) |
- self._CheckEvent(events[2], 'mouseup', 0, center_x, center_y) |
- |
- |
-class TypingTest(ChromeDriverTest): |
- |
- def setUp(self): |
- super(TypingTest, self).setUp() |
- self._driver = self.GetNewDriver() |
- |
- def testSendKeysToEditingHostDiv(self): |
- self._driver.get(self.GetTestDataUrl() + '/content_editable.html') |
- div = self._driver.find_element_by_name('editable') |
- # Break into two to ensure element doesn't lose focus. |
- div.send_keys('hi') |
- div.send_keys(' there') |
- self.assertEquals('hi there', div.text) |
- |
- def testSendKeysToNonFocusableChildOfEditingHost(self): |
- self._driver.get(self.GetTestDataUrl() + '/content_editable.html') |
- child = self._driver.find_element_by_name('editable_child') |
- self.assertRaises(WebDriverException, child.send_keys, 'hi') |
- |
- def testSendKeysToFocusableChildOfEditingHost(self): |
- self._driver.get(self.GetTestDataUrl() + '/content_editable.html') |
- child = self._driver.find_element_by_tag_name('input') |
- child.send_keys('hi') |
- child.send_keys(' there') |
- self.assertEquals('hi there', child.get_attribute('value')) |
- |
- def testSendKeysToDesignModePage(self): |
- self._driver.get(self.GetTestDataUrl() + '/design_mode_doc.html') |
- body = self._driver.find_element_by_tag_name('body') |
- body.send_keys('hi') |
- body.send_keys(' there') |
- self.assertEquals('hi there', body.text) |
- |
- def testSendKeysToDesignModeIframe(self): |
- self._driver.get(self.GetTestDataUrl() + '/content_editable.html') |
- self._driver.switch_to_frame(0) |
- body = self._driver.find_element_by_tag_name('body') |
- body.send_keys('hi') |
- body.send_keys(' there') |
- self.assertEquals('hi there', body.text) |
- |
- def testSendKeysToTransparentElement(self): |
- self._driver.get(self.GetTestDataUrl() + '/transparent.html') |
- text_box = self._driver.find_element_by_tag_name('input') |
- text_box.send_keys('hi') |
- self.assertEquals('hi', text_box.get_attribute('value')) |
- |
- def testSendKeysDesignModePageAfterNavigate(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- self._driver.get(self.GetTestDataUrl() + '/design_mode_doc.html') |
- body = self._driver.find_element_by_tag_name('body') |
- body.send_keys('hi') |
- body.send_keys(' there') |
- self.assertEquals('hi there', body.text) |
- |
- def testAppendsToTextInput(self): |
- self._driver.get(self.GetTestDataUrl() + '/keyboard.html') |
- text_elem = self._driver.find_element_by_name('input') |
- text_elem.send_keys(' text') |
- self.assertEquals('more text', text_elem.get_attribute('value')) |
- area_elem = self._driver.find_element_by_name('area') |
- area_elem.send_keys(' text') |
- self.assertEquals('more text', area_elem.get_attribute('value')) |
- |
- def testTextAreaKeepsCursorPosition(self): |
- self._driver.get(self.GetTestDataUrl() + '/keyboard.html') |
- area_elem = self._driver.find_element_by_name('area') |
- area_elem.send_keys(' text') |
- area_elem.send_keys(Keys.LEFT * 9) |
- area_elem.send_keys('much ') |
- self.assertEquals('much more text', area_elem.get_attribute('value')) |
- |
- def testWithWebWidgets(self): |
- def SetHTML(html): |
- """Sets the page HTML. |
- |
- The given HTML should not contain single quotes. |
- """ |
- assert '\'' not in html |
- self._driver.execute_script('document.body.innerHTML = \'%s\'' % html) |
- SetHTML('<input type="checkbox">check</input>') |
- elem = self._driver.find_element_by_tag_name('input') |
- elem.send_keys(' ') |
- self.assertTrue(elem.is_selected()) |
- elem.send_keys(' ') |
- self.assertFalse(elem.is_selected()) |
- |
- SetHTML('<input type="radio" name="g" checked>1</input>' + |
- '<input type="radio" name="g">2</input>') |
- elem1, elem2 = self._driver.find_elements_by_tag_name('input') |
- elem1.send_keys(Keys.RIGHT) |
- self.assertTrue(elem2.is_selected()) |
- elem2.send_keys(Keys.LEFT) |
- self.assertFalse(elem2.is_selected()) |
- |
- SetHTML('<select><option>a</option><option>b</option></select>') |
- elem = self._driver.find_element_by_tag_name('select') |
- elem.send_keys('b') |
- self.assertEquals('b', elem.get_attribute('value')) |
- |
- handler = 'javascript:document.title=\\x27success\\x27' |
- SetHTML('<input type="button" onclick="%s"></input>' % handler) |
- elem = self._driver.find_element_by_tag_name('input') |
- elem.send_keys(' ') |
- self.assertEquals('success', self._driver.title) |
- |
- |
-class UrlBaseTest(ChromeDriverTest): |
- """Tests that the server can be configured for a different URL base.""" |
- |
- def setUp(self): |
- self._server2 = ChromeDriverLauncher(self.GetDriverPath(), |
- url_base='/wd/hub').Launch() |
- |
- def tearDown(self): |
- self._server2.Kill() |
- |
- def testCreatingSessionShouldRedirectToCorrectURL(self): |
- request_url = self._server2.GetUrl() + '/session' |
- response = SendRequest(request_url, method='POST', |
- data='{"desiredCapabilities":{}}') |
- self.assertEquals(200, response.code) |
- self.session_url = response.geturl() # TODO(jleyba): verify this URL? |
- |
- data = json.loads(response.read()) |
- self.assertTrue(isinstance(data, dict)) |
- self.assertEquals(0, data['status']) |
- |
- url_parts = urlparse.urlparse(self.session_url)[2].split('/') |
- self.assertEquals(5, len(url_parts)) |
- self.assertEquals('', url_parts[0]) |
- self.assertEquals('wd', url_parts[1]) |
- self.assertEquals('hub', url_parts[2]) |
- self.assertEquals('session', url_parts[3]) |
- self.assertEquals(data['sessionId'], url_parts[4]) |
- |
- |
-# TODO(jleyba): Port this to WebDriver's own python test suite. |
-class ElementEqualityTest(ChromeDriverTest): |
- """Tests that the server properly checks element equality.""" |
- |
- def setUp(self): |
- super(ElementEqualityTest, self).setUp() |
- self._driver = self.GetNewDriver() |
- |
- def tearDown(self): |
- self._driver.quit() |
- |
- def testElementEquality(self): |
- self._driver.get(self.GetTestDataUrl() + '/test_page.html') |
- body1 = self._driver.find_element_by_tag_name('body') |
- body2 = self._driver.execute_script('return document.body') |
- |
- # TODO(jleyba): WebDriver's python bindings should expose a proper API |
- # for this. |
- result = body1._execute(Command.ELEMENT_EQUALS, { |
- 'other': body2.id |
- }) |
- self.assertTrue(result['value']) |
- |
- |
-class LoggingTest(ChromeDriverTest): |
- |
- def testLogging(self): |
- url = self.GetServer().GetUrl() |
- req = SendRequest(url + '/log', method='GET') |
- log = req.read() |
- self.assertTrue('INFO' in log, msg='INFO not in log: ' + log) |
- |
- |
-class FileUploadControlTest(ChromeDriverTest): |
- """Tests dealing with file upload control.""" |
- |
- def setUp(self): |
- super(FileUploadControlTest, self).setUp() |
- self._driver = self.GetNewDriver() |
- |
- # Fails on win - crbug.com/131782 |
- def DISABLED_testSetFilePathToFileUploadControl(self): |
- """Verify a file path is set to the file upload control.""" |
- self._driver.get(self.GetTestDataUrl() + '/upload.html') |
- |
- tmp_file = tempfile.NamedTemporaryFile() |
- |
- fileupload_single = self._driver.find_element_by_name('fileupload_single') |
- multiple = fileupload_single.get_attribute('multiple') |
- self.assertEqual('false', multiple) |
- fileupload_single.send_keys(tmp_file.name) |
- path = fileupload_single.get_attribute('value') |
- self.assertTrue(path.endswith(os.path.basename(tmp_file.name))) |
- |
- def testSetMultipleFilePathsToFileuploadControlWithoutMultipleWillFail(self): |
- """Verify setting file paths to the file upload control without 'multiple' |
- attribute will fail.""" |
- self._driver.get(self.GetTestDataUrl() + '/upload.html') |
- |
- files = [] |
- filepaths = [] |
- for index in xrange(4): |
- tmp_file = tempfile.NamedTemporaryFile() |
- # We need to hold the file objects because the files will be deleted on |
- # GC. |
- files.append(tmp_file) |
- filepath = tmp_file.name |
- filepaths.append(filepath) |
- |
- fileupload_single = self._driver.find_element_by_name('fileupload_single') |
- self.assertFalse(fileupload_single.get_attribute('multiple')) |
- self.assertRaises(WebDriverException, fileupload_single.send_keys, |
- '\n'.join(filepaths)) |
- |
- def testSetMultipleFilePathsToFileUploadControl(self): |
- """Verify multiple file paths are set to the file upload control.""" |
- self._driver.get(self.GetTestDataUrl() + '/upload.html') |
- |
- files = [] |
- filepaths = [] |
- filenames = set() |
- for index in xrange(4): |
- tmp_file = tempfile.NamedTemporaryFile() |
- files.append(tmp_file) |
- filepath = tmp_file.name |
- filepaths.append(filepath) |
- filenames.add(os.path.basename(filepath)) |
- |
- fileupload_multi = self._driver.find_element_by_name('fileupload_multi') |
- multiple = fileupload_multi.get_attribute('multiple') |
- self.assertEqual('true', multiple) |
- fileupload_multi.send_keys('\n'.join(filepaths)) |
- |
- files_on_element = self._driver.execute_script( |
- 'return document.getElementById("fileupload_multi").files;') |
- self.assertTrue(files_on_element) |
- self.assertEqual(4, len(files_on_element)) |
- for f in files_on_element: |
- self.assertTrue(f['name'] in filenames) |
- |
- |
-class FrameSwitchingTest(ChromeDriverTest): |
- |
- def testGetWindowHandles(self): |
- driver = self.GetNewDriver({'chrome.switches': ['disable-popup-blocking']}) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- driver.execute_script('window.popup = window.open("about:blank")') |
- self.assertEquals(2, len(driver.window_handles)) |
- driver.execute_script('window.popup.close()') |
- self.assertEquals(1, len(driver.window_handles)) |
- |
- def testSwitchToSameWindow(self): |
- driver = self.GetNewDriver({'chrome.switches': ['disable-popup-blocking']}) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- driver.switch_to_window(driver.window_handles[0]) |
- self.assertEquals('test_page.html', driver.current_url.split('/')[-1]) |
- |
- def testClosedWindowThrows(self): |
- driver = self.GetNewDriver({'chrome.switches': ['disable-popup-blocking']}) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- driver.execute_script('window.open("about:blank")') |
- driver.close() |
- self.assertRaises(WebDriverException, driver.close) |
- |
- def testSwitchFromClosedWindow(self): |
- driver = self.GetNewDriver({'chrome.switches': ['disable-popup-blocking']}) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- driver.execute_script('window.open("about:blank")') |
- old_window = driver.current_window_handle |
- driver.close() |
- driver.switch_to_window(driver.window_handles[0]) |
- self.assertEquals('about:blank', driver.current_url) |
- |
- def testSwitchToWindowWhileInSubframe(self): |
- driver = self.GetNewDriver({'chrome.switches': ['disable-popup-blocking']}) |
- driver.get(self.GetTestDataUrl() + '/test_page.html') |
- driver.execute_script('window.open("about:blank")') |
- driver.switch_to_frame(0) |
- driver.switch_to_window(driver.window_handles[1]) |
- self.assertEquals('about:blank', driver.current_url) |
- |
- # Tests that the indexing is absolute and not based on index of frame in its |
- # parent element. |
- # See crbug.com/88685. |
- def testSwitchToFrameByIndex(self): |
- driver = self.GetNewDriver({'chrome.switches': ['disable-popup-blocking']}) |
- driver.get(self.GetTestDataUrl() + '/switch_to_frame_by_index.html') |
- for i in range(3): |
- driver.switch_to_frame(i) |
- self.assertEquals(str(i), driver.current_url.split('?')[-1]) |
- driver.switch_to_default_content() |
- |
- |
-class AlertTest(ChromeDriverTest): |
- |
- def testAlertOnLoadDoesNotHang(self): |
- driver = self.GetNewDriver() |
- self.assertRaises(WebDriverException, driver.get, |
- self.GetTestDataUrl() + '/alert_on_load.html') |
- driver.switch_to_alert().accept() |
- |
- def testAlertWhenTypingThrows(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/alerts.html') |
- input_box = driver.find_element_by_name('onkeypress') |
- self.assertRaises(WebDriverException, input_box.send_keys, 'a') |
- |
- def testAlertJustAfterTypingDoesNotThrow(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/alerts.html') |
- driver.find_element_by_name('onkeyup').send_keys('a') |
- driver.switch_to_alert().accept() |
- |
- def testAlertOnScriptDoesNotHang(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/alerts.html') |
- self.assertRaises(WebDriverException, driver.execute_script, 'alert("ok")') |
- |
- # See http://code.google.com/p/selenium/issues/detail?id=2671. |
- def testCanPerformJSBasedActionsThatCauseAlertsAtTheEnd(self): |
- driver = self.GetNewDriver() |
- driver.execute_script( |
- 'var select = document.createElement("select");' + |
- 'select.innerHTML = "<option>1</option><option>2</option>";' + |
- 'select.addEventListener("change", function() { alert("hi"); });' + |
- 'document.body.appendChild(select);') |
- |
- # Shouldn't throw an exception, even though an alert appears mid-script. |
- driver.find_elements_by_tag_name('option')[-1].click() |
- |
- def testMustHandleAlertFirst(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/alerts.html') |
- input_box = driver.find_element_by_name('normal') |
- driver.execute_async_script('arguments[0](); window.alert("ok")') |
- |
- self.assertRaises(WebDriverException, driver.execute_script, 'a = 1') |
- |
- self.assertRaises(WebDriverException, input_box.send_keys, 'abc') |
- |
- self.assertRaises(WebDriverException, driver.get, |
- self.GetTestDataUrl() + '/test_page.html') |
- |
- self.assertRaises(WebDriverException, driver.refresh) |
- self.assertRaises(WebDriverException, driver.back) |
- self.assertRaises(WebDriverException, driver.forward) |
- self.assertRaises(WebDriverException, driver.get_screenshot_as_base64) |
- |
- def testCanHandleAlertInSubframe(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/alerts.html') |
- driver.switch_to_frame('subframe') |
- driver.execute_async_script('arguments[0](); window.alert("ok")') |
- driver.switch_to_alert().accept() |
- |
- |
-class WindowTest(ChromeDriverTest): |
- """Tests for WebDriver window commands.""" |
- |
- def setUp(self): |
- super(WindowTest, self).setUp() |
- self._driver = self.GetNewDriver() |
- |
- def testSize(self): |
- size = self._driver.get_window_size() |
- self._driver.set_window_size(size['width'], size['height']) |
- self.assertEquals(size, self._driver.get_window_size()) |
- self._driver.set_window_size(800, 600) |
- self.assertEquals(800, self._driver.get_window_size()['width']) |
- self.assertEquals(600, self._driver.get_window_size()['height']) |
- |
- def testPosition(self): |
- pos = self._driver.get_window_position() |
- self._driver.set_window_position(pos['x'], pos['y']) |
- self.assertEquals(pos, self._driver.get_window_position()) |
- self._driver.set_window_position(100, 200) |
- self.assertEquals(100, self._driver.get_window_position()['x']) |
- self.assertEquals(200, self._driver.get_window_position()['y']) |
- |
- # Systems without window manager (Xvfb, Xvnc) do not implement maximization. |
- @SkipIf(util.IsLinux()) |
- def testMaximize(self): |
- old_size = self._driver.get_window_size() |
- self._driver.maximize_window() |
- new_size = self._driver.get_window_size() |
- self.assertTrue(old_size['width'] <= new_size['width']) |
- self.assertTrue(old_size['height'] <= new_size['height']) |
- |
- def testWindowHandle(self): |
- """Test specifying window handle.""" |
- self._driver.execute_script( |
- 'window.open("about:blank", "name", "height=200, width=200")') |
- windows = self._driver.window_handles |
- self.assertEquals(2, len(windows)) |
- self._driver.set_window_size(400, 300, windows[1]) |
- self.assertEquals(400, self._driver.get_window_size(windows[1])['width']) |
- self.assertEquals(300, self._driver.get_window_size(windows[1])['height']) |
- self.assertNotEquals(self._driver.get_window_size(windows[1]), |
- self._driver.get_window_size(windows[0])) |
- |
- def testInvalidWindowHandle(self): |
- """Tests specifying invalid handle.""" |
- invalid_handle = 'f1-120' |
- self.assertRaises(WebDriverException, self._driver.set_window_size, |
- 400, 300, invalid_handle) |
- self.assertRaises(NoSuchWindowException, self._driver.get_window_size, |
- invalid_handle) |
- self.assertRaises(NoSuchWindowException, self._driver.set_window_position, |
- 1, 1, invalid_handle) |
- self.assertRaises(NoSuchWindowException, self._driver.get_window_position, |
- invalid_handle) |
- |
- |
-class GeolocationTest(ChromeDriverTest): |
- """Tests for WebDriver geolocation commands.""" |
- |
- def testGeolocation(self): |
- """Tests the get and set geolocation commands.""" |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/empty.html') |
- |
- # TODO(kkania): Update the python bindings and get rid of these. |
- driver.command_executor._commands.update({ |
- 'getLoc': ('GET', '/session/$sessionId/location'), |
- 'setLoc': ('POST', '/session/$sessionId/location') |
- }) |
- def getLocation(): |
- return driver.execute('getLoc')['value'] |
- def setLocation(location): |
- driver.execute('setLoc', {'location': location}) |
- expected_location = {'latitude': 50, 'longitude': 50, 'altitude': 300} |
- setLocation(expected_location) |
- location = getLocation() |
- self.assertEquals(expected_location, location) |
- |
- driver.set_script_timeout(10) |
- result = driver.execute_async_script(""" |
- var callback = arguments[0]; |
- window.navigator.geolocation.getCurrentPosition( |
- function success(result) { callback(result.coords); }, |
- function fail(error) { callback(error.message); });""") |
- self.assertEquals(expected_location['latitude'], result['latitude']) |
- self.assertEquals(expected_location['longitude'], result['longitude']) |
- self.assertEquals(expected_location['altitude'], result['altitude']) |
- |
- |
-class ExtensionTest(ChromeDriverTest): |
- |
- INFOBAR_BROWSER_ACTION_EXTENSION = test_paths.TEST_DATA_PATH + \ |
- '/infobar_browser_action_extension' |
- PAGE_ACTION_EXTENSION = test_paths.TEST_DATA_PATH + \ |
- '/page_action_extension' |
- APP_SHELL = test_paths.TEST_DATA_PATH + \ |
- '/app_shell_extension' |
- |
- def testExtensionInstallAndUninstall(self): |
- driver = self.GetNewDriver() |
- self.assertEquals(0, len(driver.get_installed_extensions())) |
- ext = driver.install_extension(self.PAGE_ACTION_EXTENSION) |
- extensions = driver.get_installed_extensions() |
- self.assertEquals(1, len(extensions)) |
- self.assertEquals(ext.id, extensions[0].id) |
- ext.uninstall() |
- self.assertEquals(0, len(driver.get_installed_extensions())) |
- |
- def testExtensionInfo(self): |
- driver = self.GetNewDriver() |
- ext = driver.install_extension(self.PAGE_ACTION_EXTENSION) |
- self.assertEquals('Page action extension', ext.get_name()) |
- self.assertEquals('1.0', ext.get_version()) |
- self.assertEquals(32, len(ext.id)) |
- self.assertTrue(ext.is_enabled()) |
- ext.set_enabled(True) |
- ext.set_enabled(False) |
- self.assertFalse(ext.is_enabled()) |
- ext.set_enabled(True) |
- self.assertTrue(ext.is_enabled()) |
- |
- def _testExtensionView(self, driver, view_handle, extension): |
- """Tests that the given view supports basic WebDriver functionality.""" |
- driver.switch_to_window(view_handle) |
- self.assertTrue(driver.execute_script('return true')) |
- checkbox = driver.find_element_by_id('checkbox') |
- checkbox.click() |
- self.assertTrue(checkbox.is_selected()) |
- textfield = driver.find_element_by_id('textfield') |
- textfield.send_keys('test') |
- self.assertEquals('test', textfield.get_attribute('value')) |
- self.assertEquals('test', driver.title) |
- self.assertTrue(driver.current_url.endswith('view_checks.html')) |
- self.assertTrue('Should be in page source' in driver.page_source) |
- driver.close() |
- def is_view_closed(driver): |
- return len(filter(lambda view: view['handle'] == view_handle, |
- extension._get_views())) == 0 |
- WebDriverWait(driver, 10).until(is_view_closed) |
- |
- # Mac extension infobars are currently broken: crbug.com/107573. |
- @SkipIf(util.IsMac()) |
- def testInfobarView(self): |
- driver = self.GetNewDriver({'chrome.switches': |
- ['enable-experimental-extension-apis']}) |
- ext = driver.install_extension(self.INFOBAR_BROWSER_ACTION_EXTENSION) |
- driver.switch_to_window(ext.get_bg_page_handle()) |
- driver.set_script_timeout(10) |
- driver.execute_async_script('waitForInfobar(arguments[0])') |
- self._testExtensionView(driver, ext.get_infobar_handles()[0], ext) |
- |
- def testBrowserActionPopupView(self): |
- driver = self.GetNewDriver({'chrome.switches': |
- ['enable-experimental-extension-apis']}) |
- ext = driver.install_extension(self.INFOBAR_BROWSER_ACTION_EXTENSION) |
- ext.click_browser_action() |
- self._testExtensionView(driver, ext.get_popup_handle(), ext) |
- |
- def testPageActionPopupView(self): |
- driver = self.GetNewDriver() |
- ext = driver.install_extension(self.PAGE_ACTION_EXTENSION) |
- def is_page_action_visible(driver): |
- return ext.is_page_action_visible() |
- WebDriverWait(driver, 10).until(is_page_action_visible) |
- ext.click_page_action() |
- self._testExtensionView(driver, ext.get_popup_handle(), ext) |
- |
- def testAppShellView(self): |
- driver = self.GetNewDriver({'chrome.switches': |
- ['enable-experimental-extension-apis']}) |
- ext = driver.install_extension(self.APP_SHELL) |
- |
- # Navigates to the new tab page to launch the app. |
- driver.get('chrome:newtab') |
- app = driver.find_element_by_xpath("//div[@title='App Shell']") |
- app.click() |
- def is_app_window_launched(driver): |
- return ext.get_app_shell_handle() is not None |
- WebDriverWait(driver, 10).until(is_app_window_launched) |
- self._testExtensionView(driver, ext.get_app_shell_handle(), ext) |
- |
- |
-class BadJSTest(ChromeDriverTest): |
- """Tests that ensure sites with hacky JS don't break ChromeDriver.""" |
- |
- def testFindElementDoesNotUseNativeFuncs(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/bad_native_funcs.html') |
- # This will throw an exception if any native funcs are used. |
- driver.find_element_by_tag_name('body').find_elements_by_tag_name('div') |
- |
- |
-class ContentSettingsTest(ChromeDriverTest): |
- """Tests that various types of content are allowed by default.""" |
- |
- def testPopups(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/empty.html') |
- driver.execute_script('window.open("about:blank")') |
- self.assertEquals(2, len(driver.window_handles)) |
- |
- # Failing on win7: crbug.com/141231. |
- @SkipIf(util.IsWin()) |
- def testPopupsCanBeResized(self): |
- """Regression test for chromedriver issue 126.""" |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/empty.html') |
- driver.execute_script( |
- 'window.open("empty.html", "popup", "width=500,height=500")') |
- driver.switch_to_window(driver.window_handles[1]) |
- size = driver.get_window_size() |
- bigger_size = dict(map(lambda x: (x, size[x] + 100), size)) |
- smaller_size = dict(map(lambda x: (x, size[x] - 100), size)) |
- driver.set_window_size(bigger_size['width'], bigger_size['height']) |
- self.assertEquals(bigger_size, driver.get_window_size()) |
- driver.set_window_size(smaller_size['width'], smaller_size['height']) |
- self.assertEquals(smaller_size, driver.get_window_size()) |
- |
- def testGeolocation(self): |
- driver = self.GetNewDriver() |
- driver.get(self.GetTestDataUrl() + '/empty.html') |
- driver.set_script_timeout(10) |
- # Will timeout if infobar appears. |
- driver.execute_async_script( |
- 'navigator.geolocation.getCurrentPosition(arguments[0], arguments[0]);') |
- |
- def testMediaStream(self): |
- driver = self.GetNewDriver() |
- # Allowing camera/mic access by default only works for https sites. |
- driver.get(self.GetHttpsTestDataUrl() + '/empty.html') |
- driver.set_script_timeout(10) |
- # Will timeout if infobar appears. |
- driver.execute_async_script( |
- 'navigator.webkitGetUserMedia({audio:true, video:true},' + |
- ' arguments[0], arguments[0]);') |