| # 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. |
| from selenium.webdriver.common.desired_capabilities import DesiredCapabilities |
| |
| |
| class ElementScrollBehavior(object): |
| TOP = 0 |
| BOTTOM = 1 |
| |
| |
| class Options(object): |
| |
| KEY = 'se:ieOptions' |
| SWITCHES = 'ie.browserCommandLineSwitches' |
| |
| BROWSER_ATTACH_TIMEOUT = 'browserAttachTimeout' |
| ELEMENT_SCROLL_BEHAVIOR = 'elementScrollBehavior' |
| ENSURE_CLEAN_SESSION = 'ie.ensureCleanSession' |
| FILE_UPLOAD_DIALOG_TIMEOUT = 'ie.fileUploadDialogTimeout' |
| FORCE_CREATE_PROCESS_API = 'ie.forceCreateProcessApi' |
| FORCE_SHELL_WINDOWS_API = 'ie.forceShellWindowsApi' |
| FULL_PAGE_SCREENSHOT = 'ie.enableFullPageScreenshot' |
| IGNORE_PROTECTED_MODE_SETTINGS = 'ignoreProtectedModeSettings' |
| IGNORE_ZOOM_LEVEL = 'ignoreZoomSetting' |
| INITIAL_BROWSER_URL = 'initialBrowserUrl' |
| NATIVE_EVENTS = 'nativeEvents' |
| PERSISTENT_HOVER = 'enablePersistentHover' |
| REQUIRE_WINDOW_FOCUS = 'requireWindowFocus' |
| USE_PER_PROCESS_PROXY = 'ie.usePerProcessProxy' |
| VALIDATE_COOKIE_DOCUMENT_TYPE = 'ie.validateCookieDocumentType' |
| |
| def __init__(self): |
| self._arguments = [] |
| self._options = {} |
| self._additional = {} |
| self._caps = DesiredCapabilities.INTERNETEXPLORER.copy() |
| |
| @property |
| def arguments(self): |
| """ Returns a list of browser process arguments """ |
| return self._arguments |
| |
| def add_argument(self, argument): |
| """ Add argument to be used for the browser process """ |
| if argument is None: |
| raise ValueError() |
| self._arguments.append(argument) |
| |
| @property |
| def options(self): |
| """ Returns a dictionary of browser options """ |
| return self._options |
| |
| @property |
| def capabilities(self): |
| return self._caps |
| |
| def set_capability(self, name, value): |
| """Sets a capability.""" |
| self._caps[name] = value |
| |
| @property |
| def browser_attach_timeout(self): |
| """ Returns the options Browser Attach Timeout in milliseconds """ |
| return self._options.get(self.BROWSER_ATTACH_TIMEOUT) |
| |
| @browser_attach_timeout.setter |
| def browser_attach_timeout(self, value): |
| """ |
| Sets the options Browser Attach Timeout |
| |
| :Args: |
| - value: Timeout in milliseconds |
| |
| """ |
| if not isinstance(value, int): |
| raise ValueError('Browser Attach Timeout must be an integer.') |
| self._options[self.BROWSER_ATTACH_TIMEOUT] = value |
| |
| @property |
| def element_scroll_behavior(self): |
| """ Returns the options Element Scroll Behavior in milliseconds """ |
| return self._options.get(self.ELEMENT_SCROLL_BEHAVIOR) |
| |
| @element_scroll_behavior.setter |
| def element_scroll_behavior(self, value): |
| """ |
| Sets the options Element Scroll Behavior |
| |
| :Args: |
| - value: 0 - Top, 1 - Bottom |
| |
| """ |
| if value not in [ElementScrollBehavior.TOP, ElementScrollBehavior.BOTTOM]: |
| raise ValueError('Element Scroll Behavior out of range.') |
| self._options[self.ELEMENT_SCROLL_BEHAVIOR] = value |
| |
| @property |
| def ensure_clean_session(self): |
| """ Returns the options Ensure Clean Session value """ |
| return self._options.get(self.ENSURE_CLEAN_SESSION) |
| |
| @ensure_clean_session.setter |
| def ensure_clean_session(self, value): |
| """ |
| Sets the options Ensure Clean Session value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.ENSURE_CLEAN_SESSION] = value |
| |
| @property |
| def file_upload_dialog_timeout(self): |
| """ Returns the options File Upload Dialog Timeout in milliseconds """ |
| return self._options.get(self.FILE_UPLOAD_DIALOG_TIMEOUT) |
| |
| @file_upload_dialog_timeout.setter |
| def file_upload_dialog_timeout(self, value): |
| """ |
| Sets the options File Upload Dialog Timeout value |
| |
| :Args: |
| - value: Timeout in milliseconds |
| |
| """ |
| if not isinstance(value, int): |
| raise ValueError('File Upload Dialog Timeout must be an integer.') |
| self._options[self.FILE_UPLOAD_DIALOG_TIMEOUT] = value |
| |
| @property |
| def force_create_process_api(self): |
| """ Returns the options Force Create Process Api value """ |
| return self._options.get(self.FORCE_CREATE_PROCESS_API) |
| |
| @force_create_process_api.setter |
| def force_create_process_api(self, value): |
| """ |
| Sets the options Force Create Process Api value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.FORCE_CREATE_PROCESS_API] = value |
| |
| @property |
| def force_shell_windows_api(self): |
| """ Returns the options Force Shell Windows Api value """ |
| return self._options.get(self.FORCE_SHELL_WINDOWS_API) |
| |
| @force_shell_windows_api.setter |
| def force_shell_windows_api(self, value): |
| """ |
| Sets the options Force Shell Windows Api value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.FORCE_SHELL_WINDOWS_API] = value |
| |
| @property |
| def full_page_screenshot(self): |
| """ Returns the options Full Page Screenshot value """ |
| return self._options.get(self.FULL_PAGE_SCREENSHOT) |
| |
| @full_page_screenshot.setter |
| def full_page_screenshot(self, value): |
| """ |
| Sets the options Full Page Screenshot value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.FULL_PAGE_SCREENSHOT] = value |
| |
| @property |
| def ignore_protected_mode_settings(self): |
| """ Returns the options Ignore Protected Mode Settings value """ |
| return self._options.get(self.IGNORE_PROTECTED_MODE_SETTINGS) |
| |
| @ignore_protected_mode_settings.setter |
| def ignore_protected_mode_settings(self, value): |
| """ |
| Sets the options Ignore Protected Mode Settings value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.IGNORE_PROTECTED_MODE_SETTINGS] = value |
| |
| @property |
| def ignore_zoom_level(self): |
| """ Returns the options Ignore Zoom Level value """ |
| return self._options.get(self.IGNORE_ZOOM_LEVEL) |
| |
| @ignore_zoom_level.setter |
| def ignore_zoom_level(self, value): |
| """ |
| Sets the options Ignore Zoom Level value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.IGNORE_ZOOM_LEVEL] = value |
| |
| @property |
| def initial_browser_url(self): |
| """ Returns the options Initial Browser Url value """ |
| return self._options.get(self.INITIAL_BROWSER_URL) |
| |
| @initial_browser_url.setter |
| def initial_browser_url(self, value): |
| """ |
| Sets the options Initial Browser Url value |
| |
| :Args: |
| - value: URL string |
| |
| """ |
| self._options[self.INITIAL_BROWSER_URL] = value |
| |
| @property |
| def native_events(self): |
| """ Returns the options Native Events value """ |
| return self._options.get(self.NATIVE_EVENTS) |
| |
| @native_events.setter |
| def native_events(self, value): |
| """ |
| Sets the options Native Events value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.NATIVE_EVENTS] = value |
| |
| @property |
| def persistent_hover(self): |
| """ Returns the options Persistent Hover value """ |
| return self._options.get(self.PERSISTENT_HOVER) |
| |
| @persistent_hover.setter |
| def persistent_hover(self, value): |
| """ |
| Sets the options Persistent Hover value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.PERSISTENT_HOVER] = value |
| |
| @property |
| def require_window_focus(self): |
| """ Returns the options Require Window Focus value """ |
| return self._options.get(self.REQUIRE_WINDOW_FOCUS) |
| |
| @require_window_focus.setter |
| def require_window_focus(self, value): |
| """ |
| Sets the options Require Window Focus value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.REQUIRE_WINDOW_FOCUS] = value |
| |
| @property |
| def use_per_process_proxy(self): |
| """ Returns the options User Per Process Proxy value """ |
| return self._options.get(self.USE_PER_PROCESS_PROXY) |
| |
| @use_per_process_proxy.setter |
| def use_per_process_proxy(self, value): |
| """ |
| Sets the options User Per Process Proxy value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.USE_PER_PROCESS_PROXY] = value |
| |
| @property |
| def validate_cookie_document_type(self): |
| """ Returns the options Validate Cookie Document Type value """ |
| return self._options.get(self.VALIDATE_COOKIE_DOCUMENT_TYPE) |
| |
| @validate_cookie_document_type.setter |
| def validate_cookie_document_type(self, value): |
| """ |
| Sets the options Validate Cookie Document Type value |
| |
| :Args: |
| - value: boolean value |
| |
| """ |
| self._options[self.VALIDATE_COOKIE_DOCUMENT_TYPE] = value |
| |
| @property |
| def additional_options(self): |
| """ Returns the additional options """ |
| return self._additional |
| |
| def add_additional_option(self, name, value): |
| """ |
| Adds an additional option not yet added as a safe option for IE |
| |
| :Args: |
| - name: name of the option to add |
| - value: value of the option to add |
| |
| """ |
| self._additional[name] = value |
| |
| def to_capabilities(self): |
| """ Marshals the IE options to a the correct object """ |
| caps = self._caps |
| |
| opts = self._options.copy() |
| if len(self._arguments) > 0: |
| opts[self.SWITCHES] = ' '.join(self._arguments) |
| |
| if len(self._additional) > 0: |
| opts.update(self._additional) |
| |
| if len(opts) > 0: |
| caps[Options.KEY] = opts |
| return caps |