1. # Licensed to the Software Freedom Conservancy (SFC) under one
    # or more contributor license agreements. See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership. The SFC licenses this file
    # to you 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.
  2.  
  3. """The WebDriver implementation."""
  4.  
  5. import base64
    import copy
    import warnings
    from contextlib import contextmanager
  6.  
  7. from .command import Command
    from .webelement import WebElement
    from .remote_connection import RemoteConnection
    from .errorhandler import ErrorHandler
    from .switch_to import SwitchTo
    from .mobile import Mobile
    from .file_detector import FileDetector, LocalFileDetector
    from selenium.common.exceptions import (InvalidArgumentException,
    WebDriverException)
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.html5.application_cache import ApplicationCache
  8.  
  9. try:
    str = basestring
    except NameError:
    pass
  10.  
  11. _W3C_CAPABILITY_NAMES = frozenset([
    'acceptInsecureCerts',
    'browserName',
    'browserVersion',
    'platformName',
    'pageLoadStrategy',
    'proxy',
    'setWindowRect',
    'timeouts',
    'unhandledPromptBehavior',
    ])
  12.  
  13. _OSS_W3C_CONVERSION = {
    'acceptSslCerts': 'acceptInsecureCerts',
    'version': 'browserVersion',
    'platform': 'platformName'
    }
  14.  
  15. def _make_w3c_caps(caps):
    """Makes a W3C alwaysMatch capabilities object.
  16.  
  17. Filters out capability names that are not in the W3C spec. Spec-compliant
    drivers will reject requests containing unknown capability names.
  18.  
  19. Moves the Firefox profile, if present, from the old location to the new Firefox
    options object.
  20.  
  21. :Args:
    - caps - A dictionary of capabilities requested by the caller.
    """
    caps = copy.deepcopy(caps)
    profile = caps.get('firefox_profile')
    always_match = {}
    if caps.get('proxy') and caps['proxy'].get('proxyType'):
    caps['proxy']['proxyType'] = caps['proxy']['proxyType'].lower()
    for k, v in caps.items():
    if v and k in _OSS_W3C_CONVERSION:
    always_match[_OSS_W3C_CONVERSION[k]] = v.lower() if k == 'platform' else v
    if k in _W3C_CAPABILITY_NAMES or ':' in k:
    always_match[k] = v
    if profile:
    moz_opts = always_match.get('moz:firefoxOptions', {})
    # If it's already present, assume the caller did that intentionally.
    if 'profile' not in moz_opts:
    # Don't mutate the original capabilities.
    new_opts = copy.deepcopy(moz_opts)
    new_opts['profile'] = profile
    always_match['moz:firefoxOptions'] = new_opts
    return {"firstMatch": [{}], "alwaysMatch": always_match}
  22.  
  23. class WebDriver(object):
    """
    Controls a browser by sending commands to a remote server.
    This server is expected to be running the WebDriver wire protocol
    as defined at
    https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
  24.  
  25. :Attributes:
    - session_id - String ID of the browser session started and controlled by this WebDriver.
    - capabilities - Dictionaty of effective capabilities of this browser session as returned
    by the remote server. See https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities
    - command_executor - remote_connection.RemoteConnection object used to execute commands.
    - error_handler - errorhandler.ErrorHandler object used to handle errors.
    """
  26.  
  27. _web_element_cls = WebElement
  28.  
  29. def __init__(self, command_executor='http://127.0.0.1:4444/wd/hub',
    desired_capabilities=None, browser_profile=None, proxy=None,
    keep_alive=False, file_detector=None):
    """
    Create a new driver that will issue commands using the wire protocol.
  30.  
  31. :Args:
    - command_executor - Either a string representing URL of the remote server or a custom
    remote_connection.RemoteConnection object. Defaults to 'http://127.0.0.1:4444/wd/hub'.
    - desired_capabilities - A dictionary of capabilities to request when
    starting the browser session. Required parameter.
    - browser_profile - A selenium.webdriver.firefox.firefox_profile.FirefoxProfile object.
    Only used if Firefox is requested. Optional.
    - proxy - A selenium.webdriver.common.proxy.Proxy object. The browser session will
    be started with given proxy settings, if possible. Optional.
    - keep_alive - Whether to configure remote_connection.RemoteConnection to use
    HTTP keep-alive. Defaults to False.
    - file_detector - Pass custom file detector object during instantiation. If None,
    then default LocalFileDetector() will be used.
    """
    if desired_capabilities is None:
    raise WebDriverException("Desired Capabilities can't be None")
    if not isinstance(desired_capabilities, dict):
    raise WebDriverException("Desired Capabilities must be a dictionary")
    if proxy is not None:
    warnings.warn("Please use FirefoxOptions to set proxy",
    DeprecationWarning)
    proxy.add_to_capabilities(desired_capabilities)
    self.command_executor = command_executor
    if type(self.command_executor) is bytes or isinstance(self.command_executor, str):
    self.command_executor = RemoteConnection(command_executor, keep_alive=keep_alive)
    self._is_remote = True
    self.session_id = None
    self.capabilities = {}
    self.error_handler = ErrorHandler()
    self.start_client()
    if browser_profile is not None:
    warnings.warn("Please use FirefoxOptions to set browser profile",
    DeprecationWarning)
    self.start_session(desired_capabilities, browser_profile)
    self._switch_to = SwitchTo(self)
    self._mobile = Mobile(self)
    self.file_detector = file_detector or LocalFileDetector()
  32.  
  33. def __repr__(self):
    return '<{0.__module__}.{0.__name__} (session="{1}")>'.format(
    type(self), self.session_id)
  34.  
  35. @contextmanager
    def file_detector_context(self, file_detector_class, *args, **kwargs):
    """
    Overrides the current file detector (if necessary) in limited context.
    Ensures the original file detector is set afterwards.
  36.  
  37. Example:
  38.  
  39. with webdriver.file_detector_context(UselessFileDetector):
    someinput.send_keys('/etc/hosts')
  40.  
  41. :Args:
    - file_detector_class - Class of the desired file detector. If the class is different
    from the current file_detector, then the class is instantiated with args and kwargs
    and used as a file detector during the duration of the context manager.
    - args - Optional arguments that get passed to the file detector class during
    instantiation.
    - kwargs - Keyword arguments, passed the same way as args.
    """
    last_detector = None
    if not isinstance(self.file_detector, file_detector_class):
    last_detector = self.file_detector
    self.file_detector = file_detector_class(*args, **kwargs)
    try:
    yield
    finally:
    if last_detector is not None:
    self.file_detector = last_detector
  42.  
  43. @property
    def mobile(self):
    return self._mobile
  44.  
  45. @property
    def name(self):
    """Returns the name of the underlying browser for this instance.
  46.  
  47. :Usage:
    - driver.name
    """
    if 'browserName' in self.capabilities:
    return self.capabilities['browserName']
    else:
    raise KeyError('browserName not specified in session capabilities')
  48.  
  49. def start_client(self):
    """
    Called before starting a new session. This method may be overridden
    to define custom startup behavior.
    """
    pass
  50.  
  51. def stop_client(self):
    """
    Called after executing a quit command. This method may be overridden
    to define custom shutdown behavior.
    """
    pass
  52.  
  53. def start_session(self, capabilities, browser_profile=None):
    """
    Creates a new session with the desired capabilities.
  54.  
  55. :Args:
    - browser_name - The name of the browser to request.
    - version - Which browser version to request.
    - platform - Which platform to request the browser on.
    - javascript_enabled - Whether the new session should support JavaScript.
    - browser_profile - A selenium.webdriver.firefox.firefox_profile.FirefoxProfile object. Only used if Firefox is requested.
    """
    if not isinstance(capabilities, dict):
    raise InvalidArgumentException("Capabilities must be a dictionary")
    if browser_profile:
    if "moz:firefoxOptions" in capabilities:
    capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
    else:
    capabilities.update({'firefox_profile': browser_profile.encoded})
    w3c_caps = _make_w3c_caps(capabilities)
    parameters = {"capabilities": w3c_caps,
    "desiredCapabilities": capabilities}
    response = self.execute(Command.NEW_SESSION, parameters)
    if 'sessionId' not in response:
    response = response['value']
    self.session_id = response['sessionId']
    self.capabilities = response.get('value')
  56.  
  57. # if capabilities is none we are probably speaking to
    # a W3C endpoint
    if self.capabilities is None:
    self.capabilities = response.get('capabilities')
  58.  
  59. # Double check to see if we have a W3C Compliant browser
    self.w3c = response.get('status') is None
  60.  
  61. def _wrap_value(self, value):
    if isinstance(value, dict):
    converted = {}
    for key, val in value.items():
    converted[key] = self._wrap_value(val)
    return converted
    elif isinstance(value, self._web_element_cls):
    return {'ELEMENT': value.id, 'element-6066-11e4-a52e-4f735466cecf': value.id}
    elif isinstance(value, list):
    return list(self._wrap_value(item) for item in value)
    else:
    return value
  62.  
  63. def create_web_element(self, element_id):
    """Creates a web element with the specified `element_id`."""
    return self._web_element_cls(self, element_id, w3c=self.w3c)
  64.  
  65. def _unwrap_value(self, value):
    if isinstance(value, dict):
    if 'ELEMENT' in value or 'element-6066-11e4-a52e-4f735466cecf' in value:
    wrapped_id = value.get('ELEMENT', None)
    if wrapped_id:
    return self.create_web_element(value['ELEMENT'])
    else:
    return self.create_web_element(value['element-6066-11e4-a52e-4f735466cecf'])
    else:
    for key, val in value.items():
    value[key] = self._unwrap_value(val)
    return value
    elif isinstance(value, list):
    return list(self._unwrap_value(item) for item in value)
    else:
    return value
  66.  
  67. def execute(self, driver_command, params=None):
    """
    Sends a command to be executed by a command.CommandExecutor.
  68.  
  69. :Args:
    - driver_command: The name of the command to execute as a string.
    - params: A dictionary of named parameters to send with the command.
  70.  
  71. :Returns:
    The command's JSON response loaded into a dictionary object.
    """
    if self.session_id is not None:
    if not params:
    params = {'sessionId': self.session_id}
    elif 'sessionId' not in params:
    params['sessionId'] = self.session_id
  72.  
  73. params = self._wrap_value(params)
    response = self.command_executor.execute(driver_command, params)
    if response:
    self.error_handler.check_response(response)
    response['value'] = self._unwrap_value(
    response.get('value', None))
    return response
    # If the server doesn't send a response, assume the command was
    # a success
    return {'success': 0, 'value': None, 'sessionId': self.session_id}
  74.  
  75. def get(self, url):
    """
    Loads a web page in the current browser session.
    """
    self.execute(Command.GET, {'url': url})
  76.  
  77. @property
    def title(self):
    """Returns the title of the current page.
  78.  
  79. :Usage:
    driver.title
    """
    resp = self.execute(Command.GET_TITLE)
    return resp['value'] if resp['value'] is not None else ""
  80.  
  81. def find_element_by_id(self, id_):
    """Finds an element by id.
  82.  
  83. :Args:
    - id\_ - The id of the element to be found.
  84.  
  85. :Usage:
    driver.find_element_by_id('foo')
    """
    return self.find_element(by=By.ID, value=id_)
  86.  
  87. def find_elements_by_id(self, id_):
    """
    Finds multiple elements by id.
  88.  
  89. :Args:
    - id\_ - The id of the elements to be found.
  90.  
  91. :Usage:
    driver.find_elements_by_id('foo')
    """
    return self.find_elements(by=By.ID, value=id_)
  92.  
  93. def find_element_by_xpath(self, xpath):
    """
    Finds an element by xpath.
  94.  
  95. :Args:
    - xpath - The xpath locator of the element to find.
  96.  
  97. :Usage:
    driver.find_element_by_xpath('//div/td[1]')
    """
    return self.find_element(by=By.XPATH, value=xpath)
  98.  
  99. def find_elements_by_xpath(self, xpath):
    """
    Finds multiple elements by xpath.
  100.  
  101. :Args:
    - xpath - The xpath locator of the elements to be found.
  102.  
  103. :Usage:
    driver.find_elements_by_xpath("//div[contains(@class, 'foo')]")
    """
    return self.find_elements(by=By.XPATH, value=xpath)
  104.  
  105. def find_element_by_link_text(self, link_text):
    """
    Finds an element by link text.
  106.  
  107. :Args:
    - link_text: The text of the element to be found.
  108.  
  109. :Usage:
    driver.find_element_by_link_text('Sign In')
    """
    return self.find_element(by=By.LINK_TEXT, value=link_text)
  110.  
  111. def find_elements_by_link_text(self, text):
    """
    Finds elements by link text.
  112.  
  113. :Args:
    - link_text: The text of the elements to be found.
  114.  
  115. :Usage:
    driver.find_elements_by_link_text('Sign In')
    """
    return self.find_elements(by=By.LINK_TEXT, value=text)
  116.  
  117. def find_element_by_partial_link_text(self, link_text):
    """
    Finds an element by a partial match of its link text.
  118.  
  119. :Args:
    - link_text: The text of the element to partially match on.
  120.  
  121. :Usage:
    driver.find_element_by_partial_link_text('Sign')
    """
    return self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)
  122.  
  123. def find_elements_by_partial_link_text(self, link_text):
    """
    Finds elements by a partial match of their link text.
  124.  
  125. :Args:
    - link_text: The text of the element to partial match on.
  126.  
  127. :Usage:
    driver.find_element_by_partial_link_text('Sign')
    """
    return self.find_elements(by=By.PARTIAL_LINK_TEXT, value=link_text)
  128.  
  129. def find_element_by_name(self, name):
    """
    Finds an element by name.
  130.  
  131. :Args:
    - name: The name of the element to find.
  132.  
  133. :Usage:
    driver.find_element_by_name('foo')
    """
    return self.find_element(by=By.NAME, value=name)
  134.  
  135. def find_elements_by_name(self, name):
    """
    Finds elements by name.
  136.  
  137. :Args:
    - name: The name of the elements to find.
  138.  
  139. :Usage:
    driver.find_elements_by_name('foo')
    """
    return self.find_elements(by=By.NAME, value=name)
  140.  
  141. def find_element_by_tag_name(self, name):
    """
    Finds an element by tag name.
  142.  
  143. :Args:
    - name: The tag name of the element to find.
  144.  
  145. :Usage:
    driver.find_element_by_tag_name('foo')
    """
    return self.find_element(by=By.TAG_NAME, value=name)
  146.  
  147. def find_elements_by_tag_name(self, name):
    """
    Finds elements by tag name.
  148.  
  149. :Args:
    - name: The tag name the use when finding elements.
  150.  
  151. :Usage:
    driver.find_elements_by_tag_name('foo')
    """
    return self.find_elements(by=By.TAG_NAME, value=name)
  152.  
  153. def find_element_by_class_name(self, name):
    """
    Finds an element by class name.
  154.  
  155. :Args:
    - name: The class name of the element to find.
  156.  
  157. :Usage:
    driver.find_element_by_class_name('foo')
    """
    return self.find_element(by=By.CLASS_NAME, value=name)
  158.  
  159. def find_elements_by_class_name(self, name):
    """
    Finds elements by class name.
  160.  
  161. :Args:
    - name: The class name of the elements to find.
  162.  
  163. :Usage:
    driver.find_elements_by_class_name('foo')
    """
    return self.find_elements(by=By.CLASS_NAME, value=name)
  164.  
  165. def find_element_by_css_selector(self, css_selector):
    """
    Finds an element by css selector.
  166.  
  167. :Args:
    - css_selector: The css selector to use when finding elements.
  168.  
  169. :Usage:
    driver.find_element_by_css_selector('#foo')
    """
    return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
  170.  
  171. def find_elements_by_css_selector(self, css_selector):
    """
    Finds elements by css selector.
  172.  
  173. :Args:
    - css_selector: The css selector to use when finding elements.
  174.  
  175. :Usage:
    driver.find_elements_by_css_selector('.foo')
    """
    return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)
  176.  
  177. def execute_script(self, script, *args):
    """
    Synchronously Executes JavaScript in the current window/frame.
  178.  
  179. :Args:
    - script: The JavaScript to execute.
    - \*args: Any applicable arguments for your JavaScript.
  180.  
  181. :Usage:
    driver.execute_script('document.title')
    """
    converted_args = list(args)
    command = None
    if self.w3c:
    command = Command.W3C_EXECUTE_SCRIPT
    else:
    command = Command.EXECUTE_SCRIPT
  182.  
  183. return self.execute(command, {
    'script': script,
    'args': converted_args})['value']
  184.  
  185. def execute_async_script(self, script, *args):
    """
    Asynchronously Executes JavaScript in the current window/frame.
  186.  
  187. :Args:
    - script: The JavaScript to execute.
    - \*args: Any applicable arguments for your JavaScript.
  188.  
  189. :Usage:
    driver.execute_async_script('document.title')
    """
    converted_args = list(args)
    if self.w3c:
    command = Command.W3C_EXECUTE_SCRIPT_ASYNC
    else:
    command = Command.EXECUTE_ASYNC_SCRIPT
  190.  
  191. return self.execute(command, {
    'script': script,
    'args': converted_args})['value']
  192.  
  193. @property
    def current_url(self):
    """
    Gets the URL of the current page.
  194.  
  195. :Usage:
    driver.current_url
    """
    return self.execute(Command.GET_CURRENT_URL)['value']
  196.  
  197. @property
    def page_source(self):
    """
    Gets the source of the current page.
  198.  
  199. :Usage:
    driver.page_source
    """
    return self.execute(Command.GET_PAGE_SOURCE)['value']
  200.  
  201. def close(self):
    """
    Closes the current window.
  202.  
  203. :Usage:
    driver.close()
    """
    self.execute(Command.CLOSE)
  204.  
  205. def quit(self):
    """
    Quits the driver and closes every associated window.
  206.  
  207. :Usage:
    driver.quit()
    """
    try:
    self.execute(Command.QUIT)
    finally:
    self.stop_client()
  208.  
  209. @property
    def current_window_handle(self):
    """
    Returns the handle of the current window.
  210.  
  211. :Usage:
    driver.current_window_handle
    """
    if self.w3c:
    return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)['value']
    else:
    return self.execute(Command.GET_CURRENT_WINDOW_HANDLE)['value']
  212.  
  213. @property
    def window_handles(self):
    """
    Returns the handles of all windows within the current session.
  214.  
  215. :Usage:
    driver.window_handles
    """
    if self.w3c:
    return self.execute(Command.W3C_GET_WINDOW_HANDLES)['value']
    else:
    return self.execute(Command.GET_WINDOW_HANDLES)['value']
  216.  
  217. def maximize_window(self):
    """
    Maximizes the current window that webdriver is using
    """
    command = Command.MAXIMIZE_WINDOW
    if self.w3c:
    command = Command.W3C_MAXIMIZE_WINDOW
    self.execute(command, {"windowHandle": "current"})
  218.  
  219. def fullscreen_window(self):
    """
    Invokes the window manager-specific 'full screen' operation
    """
    self.execute(Command.FULLSCREEN_WINDOW)
  220.  
  221. def minimize_window(self):
    """
    Invokes the window manager-specific 'minimize' operation
    """
    self.execute(Command.MINIMIZE_WINDOW)
  222.  
  223. @property
    def switch_to(self):
    return self._switch_to
  224.  
  225. # Target Locators
    def switch_to_active_element(self):
    """ Deprecated use driver.switch_to.active_element
    """
    warnings.warn("use driver.switch_to.active_element instead", DeprecationWarning)
    return self._switch_to.active_element
  226.  
  227. def switch_to_window(self, window_name):
    """ Deprecated use driver.switch_to.window
    """
    warnings.warn("use driver.switch_to.window instead", DeprecationWarning)
    self._switch_to.window(window_name)
  228.  
  229. def switch_to_frame(self, frame_reference):
    """ Deprecated use driver.switch_to.frame
    """
    warnings.warn("use driver.switch_to.frame instead", DeprecationWarning)
    self._switch_to.frame(frame_reference)
  230.  
  231. def switch_to_default_content(self):
    """ Deprecated use driver.switch_to.default_content
    """
    warnings.warn("use driver.switch_to.default_content instead", DeprecationWarning)
    self._switch_to.default_content()
  232.  
  233. def switch_to_alert(self):
    """ Deprecated use driver.switch_to.alert
    """
    warnings.warn("use driver.switch_to.alert instead", DeprecationWarning)
    return self._switch_to.alert
  234.  
  235. # Navigation
    def back(self):
    """
    Goes one step backward in the browser history.
  236.  
  237. :Usage:
    driver.back()
    """
    self.execute(Command.GO_BACK)
  238.  
  239. def forward(self):
    """
    Goes one step forward in the browser history.
  240.  
  241. :Usage:
    driver.forward()
    """
    self.execute(Command.GO_FORWARD)
  242.  
  243. def refresh(self):
    """
    Refreshes the current page.
  244.  
  245. :Usage:
    driver.refresh()
    """
    self.execute(Command.REFRESH)
  246.  
  247. # Options
    def get_cookies(self):
    """
    Returns a set of dictionaries, corresponding to cookies visible in the current session.
  248.  
  249. :Usage:
    driver.get_cookies()
    """
    return self.execute(Command.GET_ALL_COOKIES)['value']
  250.  
  251. def get_cookie(self, name):
    """
    Get a single cookie by name. Returns the cookie if found, None if not.
  252.  
  253. :Usage:
    driver.get_cookie('my_cookie')
    """
    cookies = self.get_cookies()
    for cookie in cookies:
    if cookie['name'] == name:
    return cookie
    return None
  254.  
  255. def delete_cookie(self, name):
    """
    Deletes a single cookie with the given name.
  256.  
  257. :Usage:
    driver.delete_cookie('my_cookie')
    """
    self.execute(Command.DELETE_COOKIE, {'name': name})
  258.  
  259. def delete_all_cookies(self):
    """
    Delete all cookies in the scope of the session.
  260.  
  261. :Usage:
    driver.delete_all_cookies()
    """
    self.execute(Command.DELETE_ALL_COOKIES)
  262.  
  263. def add_cookie(self, cookie_dict):
    """
    Adds a cookie to your current session.
  264.  
  265. :Args:
    - cookie_dict: A dictionary object, with required keys - "name" and "value";
    optional keys - "path", "domain", "secure", "expiry"
  266.  
  267. Usage:
    driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
    driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
    driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})
  268.  
  269. """
    self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
  270.  
  271. # Timeouts
    def implicitly_wait(self, time_to_wait):
    """
    Sets a sticky timeout to implicitly wait for an element to be found,
    or a command to complete. This method only needs to be called one
    time per session. To set the timeout for calls to
    execute_async_script, see set_script_timeout.
  272.  
  273. :Args:
    - time_to_wait: Amount of time to wait (in seconds)
  274.  
  275. :Usage:
    driver.implicitly_wait(30)
    """
    if self.w3c:
    self.execute(Command.SET_TIMEOUTS, {
    'implicit': int(float(time_to_wait) * 1000)})
    else:
    self.execute(Command.IMPLICIT_WAIT, {
    'ms': float(time_to_wait) * 1000})
  276.  
  277. def set_script_timeout(self, time_to_wait):
    """
    Set the amount of time that the script should wait during an
    execute_async_script call before throwing an error.
  278.  
  279. :Args:
    - time_to_wait: The amount of time to wait (in seconds)
  280.  
  281. :Usage:
    driver.set_script_timeout(30)
    """
    if self.w3c:
    self.execute(Command.SET_TIMEOUTS, {
    'script': int(float(time_to_wait) * 1000)})
    else:
    self.execute(Command.SET_SCRIPT_TIMEOUT, {
    'ms': float(time_to_wait) * 1000})
  282.  
  283. def set_page_load_timeout(self, time_to_wait):
    """
    Set the amount of time to wait for a page load to complete
    before throwing an error.
  284.  
  285. :Args:
    - time_to_wait: The amount of time to wait
  286.  
  287. :Usage:
    driver.set_page_load_timeout(30)
    """
    try:
    self.execute(Command.SET_TIMEOUTS, {
    'pageLoad': int(float(time_to_wait) * 1000)})
    except WebDriverException:
    self.execute(Command.SET_TIMEOUTS, {
    'ms': float(time_to_wait) * 1000,
    'type': 'page load'})
  288.  
  289. def find_element(self, by=By.ID, value=None):
    """
    'Private' method used by the find_element_by_* methods.
  290.  
  291. :Usage:
    Use the corresponding find_element_by_* instead of this.
  292.  
  293. :rtype: WebElement
    """
    if self.w3c:
    if by == By.ID:
    by = By.CSS_SELECTOR
    value = '[id="%s"]' % value
    elif by == By.TAG_NAME:
    by = By.CSS_SELECTOR
    elif by == By.CLASS_NAME:
    by = By.CSS_SELECTOR
    value = ".%s" % value
    elif by == By.NAME:
    by = By.CSS_SELECTOR
    value = '[name="%s"]' % value
    return self.execute(Command.FIND_ELEMENT, {
    'using': by,
    'value': value})['value']
  294.  
  295. def find_elements(self, by=By.ID, value=None):
    """
    'Private' method used by the find_elements_by_* methods.
  296.  
  297. :Usage:
    Use the corresponding find_elements_by_* instead of this.
  298.  
  299. :rtype: list of WebElement
    """
    if self.w3c:
    if by == By.ID:
    by = By.CSS_SELECTOR
    value = '[id="%s"]' % value
    elif by == By.TAG_NAME:
    by = By.CSS_SELECTOR
    elif by == By.CLASS_NAME:
    by = By.CSS_SELECTOR
    value = ".%s" % value
    elif by == By.NAME:
    by = By.CSS_SELECTOR
    value = '[name="%s"]' % value
  300.  
  301. # Return empty list if driver returns null
    # See https://github.com/SeleniumHQ/selenium/issues/4555
    return self.execute(Command.FIND_ELEMENTS, {
    'using': by,
    'value': value})['value'] or []
  302.  
  303. @property
    def desired_capabilities(self):
    """
    returns the drivers current desired capabilities being used
    """
    return self.capabilities
  304.  
  305. def get_screenshot_as_file(self, filename):
    """
    Saves a screenshot of the current window to a PNG image file. Returns
    False if there is any IOError, else returns True. Use full paths in
    your filename.
  306.  
  307. :Args:
    - filename: The full path you wish to save your screenshot to. This
    should end with a `.png` extension.
  308.  
  309. :Usage:
    driver.get_screenshot_as_file('/Screenshots/foo.png')
    """
    if not filename.lower().endswith('.png'):
    warnings.warn("name used for saved screenshot does not match file "
    "type. It should end with a `.png` extension", UserWarning)
    png = self.get_screenshot_as_png()
    try:
    with open(filename, 'wb') as f:
    f.write(png)
    except IOError:
    return False
    finally:
    del png
    return True
  310.  
  311. def save_screenshot(self, filename):
    """
    Saves a screenshot of the current window to a PNG image file. Returns
    False if there is any IOError, else returns True. Use full paths in
    your filename.
  312.  
  313. :Args:
    - filename: The full path you wish to save your screenshot to. This
    should end with a `.png` extension.
  314.  
  315. :Usage:
    driver.save_screenshot('/Screenshots/foo.png')
    """
    return self.get_screenshot_as_file(filename)
  316.  
  317. def get_screenshot_as_png(self):
    """
    Gets the screenshot of the current window as a binary data.
  318.  
  319. :Usage:
    driver.get_screenshot_as_png()
    """
    return base64.b64decode(self.get_screenshot_as_base64().encode('ascii'))
  320.  
  321. def get_screenshot_as_base64(self):
    """
    Gets the screenshot of the current window as a base64 encoded string
    which is useful in embedded images in HTML.
  322.  
  323. :Usage:
    driver.get_screenshot_as_base64()
    """
    return self.execute(Command.SCREENSHOT)['value']
  324.  
  325. def set_window_size(self, width, height, windowHandle='current'):
    """
    Sets the width and height of the current window. (window.resizeTo)
  326.  
  327. :Args:
    - width: the width in pixels to set the window to
    - height: the height in pixels to set the window to
  328.  
  329. :Usage:
    driver.set_window_size(800,600)
    """
    if self.w3c:
    if windowHandle != 'current':
    warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")
    self.set_window_rect(width=int(width), height=int(height))
    else:
    self.execute(Command.SET_WINDOW_SIZE, {
    'width': int(width),
    'height': int(height),
    'windowHandle': windowHandle})
  330.  
  331. def get_window_size(self, windowHandle='current'):
    """
    Gets the width and height of the current window.
  332.  
  333. :Usage:
    driver.get_window_size()
    """
    command = Command.GET_WINDOW_SIZE
    if self.w3c:
    if windowHandle != 'current':
    warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")
    size = self.get_window_rect()
    else:
    size = self.execute(command, {'windowHandle': windowHandle})
  334.  
  335. if size.get('value', None) is not None:
    size = size['value']
  336.  
  337. return {k: size[k] for k in ('width', 'height')}
  338.  
  339. def set_window_position(self, x, y, windowHandle='current'):
    """
    Sets the x,y position of the current window. (window.moveTo)
  340.  
  341. :Args:
    - x: the x-coordinate in pixels to set the window position
    - y: the y-coordinate in pixels to set the window position
  342.  
  343. :Usage:
    driver.set_window_position(0,0)
    """
    if self.w3c:
    if windowHandle != 'current':
    warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")
    return self.set_window_rect(x=int(x), y=int(y))
    else:
    self.execute(Command.SET_WINDOW_POSITION,
    {
    'x': int(x),
    'y': int(y),
    'windowHandle': windowHandle
    })
  344.  
  345. def get_window_position(self, windowHandle='current'):
    """
    Gets the x,y position of the current window.
  346.  
  347. :Usage:
    driver.get_window_position()
    """
    if self.w3c:
    if windowHandle != 'current':
    warnings.warn("Only 'current' window is supported for W3C compatibile browsers.")
    position = self.get_window_rect()
    else:
    position = self.execute(Command.GET_WINDOW_POSITION,
    {'windowHandle': windowHandle})['value']
  348.  
  349. return {k: position[k] for k in ('x', 'y')}
  350.  
  351. def get_window_rect(self):
    """
    Gets the x, y coordinates of the window as well as height and width of
    the current window.
  352.  
  353. :Usage:
    driver.get_window_rect()
    """
    return self.execute(Command.GET_WINDOW_RECT)['value']
  354.  
  355. def set_window_rect(self, x=None, y=None, width=None, height=None):
    """
    Sets the x, y coordinates of the window as well as height and width of
    the current window.
  356.  
  357. :Usage:
    driver.set_window_rect(x=10, y=10)
    driver.set_window_rect(width=100, height=200)
    driver.set_window_rect(x=10, y=10, width=100, height=200)
    """
    if (x is None and y is None) and (height is None and width is None):
    raise InvalidArgumentException("x and y or height and width need values")
  358.  
  359. return self.execute(Command.SET_WINDOW_RECT, {"x": x, "y": y,
    "width": width,
    "height": height})['value']
  360.  
  361. @property
    def file_detector(self):
    return self._file_detector
  362.  
  363. @file_detector.setter
    def file_detector(self, detector):
    """
    Set the file detector to be used when sending keyboard input.
    By default, this is set to a file detector that does nothing.
  364.  
  365. see FileDetector
    see LocalFileDetector
    see UselessFileDetector
  366.  
  367. :Args:
    - detector: The detector to use. Must not be None.
    """
    if detector is None:
    raise WebDriverException("You may not set a file detector that is null")
    if not isinstance(detector, FileDetector):
    raise WebDriverException("Detector has to be instance of FileDetector")
    self._file_detector = detector
  368.  
  369. @property
    def orientation(self):
    """
    Gets the current orientation of the device
  370.  
  371. :Usage:
    orientation = driver.orientation
    """
    return self.execute(Command.GET_SCREEN_ORIENTATION)['value']
  372.  
  373. @orientation.setter
    def orientation(self, value):
    """
    Sets the current orientation of the device
  374.  
  375. :Args:
    - value: orientation to set it to.
  376.  
  377. :Usage:
    driver.orientation = 'landscape'
    """
    allowed_values = ['LANDSCAPE', 'PORTRAIT']
    if value.upper() in allowed_values:
    self.execute(Command.SET_SCREEN_ORIENTATION, {'orientation': value})
    else:
    raise WebDriverException("You can only set the orientation to 'LANDSCAPE' and 'PORTRAIT'")
  378.  
  379. @property
    def application_cache(self):
    """ Returns a ApplicationCache Object to interact with the browser app cache"""
    return ApplicationCache(self)
  380.  
  381. @property
    def log_types(self):
    """
    Gets a list of the available log types
  382.  
  383. :Usage:
    driver.log_types
    """
    return self.execute(Command.GET_AVAILABLE_LOG_TYPES)['value']
  384.  
  385. def get_log(self, log_type):
    """
    Gets the log for a given log type
  386.  
  387. :Args:
    - log_type: type of log that which will be returned
  388.  
  389. :Usage:
    driver.get_log('browser')
    driver.get_log('driver')
    driver.get_log('client')
    driver.get_log('server')
    """
    return self.execute(Command.GET_LOG, {'type': log_type})['value']

maximize_window fullscreen_window minimize_window的更多相关文章

  1. python3+selenium3.13的简单操作

    1.浏览器 1.1 浏览器窗口大小位置 driver.set_window_size(self, width, height, windowHandle) 将某个窗口设置为固定大小 driver.se ...

  2. Selenium3 Python3 Web自动化测试从基础到项目实战之二浏览器的不同设置

    在前面一个章节我们知道了如何通过webdriver去初始化我们得driver,然后我们只需要通过driver就能够去做我们得自动化,首先我们知道我们需要知道得是当我们有driver之后,我们剩下得就是 ...

  3. web常用自动化库——selenium总结

    概述 selenium是一个模拟控制浏览器操作的自动化库,它可以做到元素定位,鼠标事件,浏览器事件,js脚本执行等操作 与request不同的是,request是单独请求一个http,而seleniu ...

  4. maximize_window()最大化浏览器和刷新当前页面refresh()

    from selenium import webdriverdriver = webdriver.Firefox()driver.get("https://www.baidu.com&quo ...

  5. selenium 常用操作

    官方文档: https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver. ...

  6. 潭州课堂25班:Ph201805201 爬虫基础 第八课 selenium (课堂笔记)

    Selenium笔记(1)安装和简单使用 简介 Selenium是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, ...

  7. Python + Selenium WebDriver Api 知识回顾

    一直再用 Selenium WebDriver 但是用的都比较零散,也没有做过总结,今天借此机会,整理一下,方便大家使用时查阅 webDriver  的属性 ['CONTEXT_CHROME', 'C ...

  8. python3 web测试模块selenium

    selenium是一个用于web应用程序测试工具,selenium测试直接运行在浏览器中,就像真正的用户在操作一样,支持的浏览器包括IE(7,8,9,10,11),mozilla firefox,sa ...

  9. sele nium 模块

    python3 web测试模块selenium   阅读目录 1.selenium安装配置 2.Selenium的基本使用 (1)声明浏览器对象 (2)定位元素 (3)元素对象(element) (4 ...

随机推荐

  1. 5.12-leepcode 作业详解

    leepcode 作业详解 1.给定一个整数数组,判断是否存在重复元素.如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 正确解答 class So ...

  2. Linux mint xfce 19 使用记录

    创建系统快照 创建系统快照是 Linux Mint 19 的重要建议,可以使用与更新管理器捆绑的 Timeshift 应用程序轻松完成创建与恢复. 这个阶段很重要,万一出现令人遗憾的事件,比如安装破坏 ...

  3. jsp从servlet中获取的值为空

    System.out.println("进入servlet"); UserServiceImpl us=new UserServiceImpl(); List<User> ...

  4. xtu read problem training 3 B - Gears

    Gears Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ID: 3789 ...

  5. E-R图

    百度百科:E-R图 100多个数据库,一万多张表,能否使用一张E-R图来表示呢?它是可以的.数据设计依赖于企业的数据,而不是数据库的设计,对企业数据适当做归类,会直接导致数据设计,最终画出E-R图,数 ...

  6. [POJ2443]Set Operation(bitset)

    传送门 题意:给出n个集合(n<=1000),每个集合中最多有10000个数,每个数的范围为1~10000,给出q次询问(q<=200000),每次给出两个数u,v判断是否有一个集合中同时 ...

  7. 手动扩大栈内存,让AC无忧

    http://blog.csdn.net/shahdza/article/details/6586430 还在因为 怕 g++ 提交时间很慢,但是用C++ 交又怕栈溢出??? 我们都知道,如果代码里有 ...

  8. 【POJ2406】Power Strings(KMP,后缀数组)

    题意: n<=1000000,cas较大 思路:这是一道论文题 后缀数组已弃疗,强行需要DC3构造,懒得(不会)写 ..]of longint; n,m,i,j,len,ans,st:longi ...

  9. 事件和委托:第 5 页 委托、事件与Observer设计模式

    原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] 委托、事件与Observer设计模式 范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之 ...

  10. POJ 2391 多源多汇拆点最大流 +flody+二分答案

    题意:在一图中,每个点有俩个属性:现在牛的数量和雨棚大小(下雨时能容纳牛的数量),每个点之间有距离, 给出牛(速度一样)在顶点之间移动所需时间,问最少时间内所有牛都能避雨. 模型分析:多源点去多汇点( ...