| Index: chrome/test/webdriver/test/chromedriver.py
|
| diff --git a/chrome/test/webdriver/test/chromedriver.py b/chrome/test/webdriver/test/chromedriver.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b26e7367eece3db64354ed4d44c606abd8a0bacb
|
| --- /dev/null
|
| +++ b/chrome/test/webdriver/test/chromedriver.py
|
| @@ -0,0 +1,204 @@
|
| +# Copyright (c) 2011 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.
|
| +
|
| +"""Chrome WebDriver that implements extra Chrome-specific functionality.
|
| +
|
| +This module is experimental and will change and break without warning.
|
| +Use at your own risk.
|
| +
|
| +Style Note: Because this is an extension to the WebDriver python API and
|
| +since this module will eventually be moved into the webdriver codebase, the
|
| +code follows WebDriver naming conventions for functions.
|
| +"""
|
| +
|
| +from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
|
| +
|
| +
|
| +class _ViewType(object):
|
| + """Constants representing different web view types in Chrome."""
|
| + TAB = 1
|
| + EXTENSION_POPUP = 2
|
| + EXTENSION_BG_PAGE = 3
|
| + EXTENSION_INFOBAR = 4
|
| +
|
| +
|
| +class WebDriver(RemoteWebDriver):
|
| + """
|
| + Controls Chrome and provides additional Chrome-specific functionality not in
|
| + the WebDriver standard.
|
| +
|
| + This class is experimental and subject to change and break without warning.
|
| + Use at your own risk.
|
| + """
|
| +
|
| + _CHROME_GET_EXTENSIONS = "chrome.getExtensions"
|
| + _CHROME_INSTALL_EXTENSION = "chrome.installExtension"
|
| + _CHROME_GET_EXTENSION_INFO = "chrome.getExtensionInfo"
|
| + _CHROME_MODIFY_EXTENSION = "chrome.setExtensionState"
|
| + _CHROME_UNINSTALL_EXTENSION = "chrome.uninstallExtension"
|
| + _CHROME_GET_VIEW_HANDLES = "chrome.getViewHandles"
|
| +
|
| + def __init__(self, url, desired_capabilities={}):
|
| + """Creates a WebDriver that controls Chrome via ChromeDriver.
|
| +
|
| + Args:
|
| + url: The URL of a running ChromeDriver server.
|
| + desired_capabilities: Requested capabilities for the new WebDriver
|
| + session.
|
| + """
|
| + RemoteWebDriver.__init__(self,
|
| + command_executor=url,
|
| + desired_capabilities=desired_capabilities)
|
| +
|
| + # Add custom commands.
|
| + custom_commands = {
|
| + WebDriver._CHROME_GET_EXTENSIONS:
|
| + ('GET', '/session/$sessionId/chrome/extensions'),
|
| + WebDriver._CHROME_INSTALL_EXTENSION:
|
| + ('POST', '/session/$sessionId/chrome/extensions'),
|
| + WebDriver._CHROME_GET_EXTENSION_INFO:
|
| + ('GET', '/session/$sessionId/chrome/extension/$id'),
|
| + WebDriver._CHROME_MODIFY_EXTENSION:
|
| + ('POST', '/session/$sessionId/chrome/extension/$id'),
|
| + WebDriver._CHROME_UNINSTALL_EXTENSION:
|
| + ('DELETE', '/session/$sessionId/chrome/extension/$id'),
|
| + WebDriver._CHROME_GET_VIEW_HANDLES:
|
| + ('GET', '/session/$sessionId/chrome/views')
|
| + }
|
| + self.command_executor._commands.update(custom_commands)
|
| +
|
| + def get_installed_extensions(self):
|
| + """Returns a list of installed extensions."""
|
| + ids = RemoteWebDriver.execute(
|
| + self, WebDriver._CHROME_GET_EXTENSIONS)['value']
|
| + return map(lambda id: Extension(self, id), ids)
|
| +
|
| + def install_extension(self, path):
|
| + """Install the extension at the given path.
|
| +
|
| + Args:
|
| + path: Path to packed or unpacked extension to install.
|
| +
|
| + Returns:
|
| + The installed extension.
|
| + """
|
| + params = {'path': path}
|
| + id = RemoteWebDriver.execute(
|
| + self, WebDriver._CHROME_INSTALL_EXTENSION, params)['value']
|
| + return Extension(self, id)
|
| +
|
| +
|
| +class Extension(object):
|
| + """Represents a Chrome extension/app."""
|
| +
|
| + def __init__(self, parent, id):
|
| + self._parent = parent
|
| + self._id = id
|
| +
|
| + @property
|
| + def id(self):
|
| + return self._id
|
| +
|
| + def get_name(self):
|
| + return self._get_info()['name']
|
| +
|
| + def get_version(self):
|
| + return self._get_info()['version']
|
| +
|
| + def is_enabled(self):
|
| + return self._get_info()['is_enabled']
|
| +
|
| + def set_enabled(self, value):
|
| + self._execute(WebDriver._CHROME_MODIFY_EXTENSION, {'enable': value})
|
| +
|
| + def is_page_action_visible(self):
|
| + """Returns whether the page action is visible in the currently targeted tab.
|
| +
|
| + This will fail if the current target is not a tab.
|
| + """
|
| + return self._get_info()['is_page_action_visible']
|
| +
|
| + def uninstall(self):
|
| + self._execute(WebDriver._CHROME_UNINSTALL_EXTENSION)
|
| +
|
| + def click_browser_action(self):
|
| + """Clicks the browser action in the currently targeted tab.
|
| +
|
| + This will fail if the current target is not a tab.
|
| + """
|
| + self._execute(WebDriver._CHROME_MODIFY_EXTENSION,
|
| + {'click_button': 'browser_action'})
|
| +
|
| + def click_page_action(self):
|
| + """Clicks the page action in the currently targeted tab.
|
| +
|
| + This will fail if the current target is not a tab.
|
| + """
|
| + self._execute(WebDriver._CHROME_MODIFY_EXTENSION,
|
| + {'click_button': 'page_action'})
|
| +
|
| + def get_bg_page_handle(self):
|
| + """Returns the window handle for the background page.
|
| +
|
| + This handle can be used with |WebDriver.switch_to_window|.
|
| +
|
| + Returns:
|
| + The window handle, or None if there is no background page.
|
| + """
|
| + bg_pages = filter(lambda view: view['type'] == _ViewType.EXTENSION_BG_PAGE,
|
| + self._get_views())
|
| + if len(bg_pages) > 0:
|
| + return bg_pages[0]['handle']
|
| + return None
|
| +
|
| + def get_popup_handle(self):
|
| + """Returns the window handle for the open browser/page action popup.
|
| +
|
| + This handle can be used with |WebDriver.switch_to_window|.
|
| +
|
| + Returns:
|
| + The window handle, or None if there is no popup open.
|
| + """
|
| + popups = filter(lambda view: view['type'] == _ViewType.EXTENSION_POPUP,
|
| + self._get_views())
|
| + if len(popups) > 0:
|
| + return popups[0]['handle']
|
| + return None
|
| +
|
| + def get_infobar_handles(self):
|
| + """Returns a list of window handles for all open infobars of this extension.
|
| +
|
| + This handle can be used with |WebDriver.switch_to_window|.
|
| + """
|
| + infobars = filter(lambda view: view['type'] == _ViewType.EXTENSION_INFOBAR,
|
| + self._get_views())
|
| + return map(lambda view: view['handle'], infobars)
|
| +
|
| + def _get_info(self):
|
| + """Returns a dictionary of all this extension's info."""
|
| + return self._execute(WebDriver._CHROME_GET_EXTENSION_INFO)['value']
|
| +
|
| + def _get_views(self):
|
| + """Returns a list of view information for this extension."""
|
| + views = self._parent.execute(WebDriver._CHROME_GET_VIEW_HANDLES)['value']
|
| + ext_views = []
|
| + for view in views:
|
| + if 'extension_id' in view and view['extension_id'] == self._id:
|
| + ext_views += [view]
|
| + return ext_views
|
| +
|
| + def _execute(self, command, params=None):
|
| + """Executes a command against the underlying extension.
|
| +
|
| + Args:
|
| + command: The name of the command to execute.
|
| + params: A dictionary of named parameters to send with the command.
|
| +
|
| + Returns:
|
| + The command's JSON response loaded into a dictionary object.
|
| + """
|
| + if not params:
|
| + params = {}
|
| + params['id'] = self._id
|
| + return self._parent.execute(command, params)
|
|
|