summaryrefslogtreecommitdiff
path: root/chromium/third_party/webdriver/pylib/selenium/webdriver/support/event_firing_webdriver.py
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webdriver/pylib/selenium/webdriver/support/event_firing_webdriver.py')
-rw-r--r--chromium/third_party/webdriver/pylib/selenium/webdriver/support/event_firing_webdriver.py326
1 files changed, 326 insertions, 0 deletions
diff --git a/chromium/third_party/webdriver/pylib/selenium/webdriver/support/event_firing_webdriver.py b/chromium/third_party/webdriver/pylib/selenium/webdriver/support/event_firing_webdriver.py
new file mode 100644
index 00000000000..5f0ee8b3781
--- /dev/null
+++ b/chromium/third_party/webdriver/pylib/selenium/webdriver/support/event_firing_webdriver.py
@@ -0,0 +1,326 @@
+#!/usr/bin/python
+#
+# Copyright 2011 Software Freedom Conservancy.
+#
+# Licensed 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.common.exceptions import WebDriverException
+from selenium.webdriver.common.by import By
+from selenium.webdriver.remote.webdriver import WebDriver
+from selenium.webdriver.remote.webelement import WebElement
+from abstract_event_listener import AbstractEventListener
+
+
+def _wrap_elements(result, ef_driver):
+ if isinstance(result, WebElement):
+ return EventFiringWebElement(result, ef_driver)
+ elif isinstance(result, list):
+ return [_wrap_elements(item, ef_driver) for item in result]
+ else:
+ return result
+
+class EventFiringWebDriver(object):
+ """
+ A wrapper around an arbitrary WebDriver instance which supports firing events
+ """
+
+ def __init__(self, driver, event_listener):
+ """
+ Creates a new instance of the EventFiringWebDriver
+
+ :Args:
+ - driver : A WebDriver instance
+ - event_listener : Instance of a class that subclasses AbstractEventListener and implements it fully or partially
+
+ Example:
+
+ .. code-block:: python
+
+ from selenium.webdriver import Firefox
+ from selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListener
+
+ class MyListener(AbstractEventListener):
+ def before_navigate_to(self, url, driver):
+ print "Before navigate to %s" % url
+ def after_navigate_to(self, url, driver):
+ print "After navigate to %s" % url
+
+ driver = Firefox()
+ ef_driver = EventFiringWebDriver(driver, MyListener())
+ ef_driver.get("http://www.google.co.in/")
+ """
+ if not isinstance(driver, WebDriver):
+ raise WebDriverException("A WebDriver instance must be supplied")
+ if not isinstance(event_listener, AbstractEventListener):
+ raise WebDriverException("Event listener must be a subclass of AbstractEventListener")
+ self._driver = driver
+ self._listener = event_listener
+
+ @property
+ def wrapped_driver(self):
+ """Returns the WebDriver instance wrapped by this EventsFiringWebDriver"""
+ return self._driver
+
+ def get(self, url):
+ self._dispatch("navigate_to", (url, self._driver), "get", (url, ))
+
+ def back(self):
+ self._dispatch("navigate_back", (self._driver,), "back", ())
+
+ def forward(self):
+ self._dispatch("navigate_forward", (self._driver,), "forward", ())
+
+ def execute_script(self, script, *args):
+ unwrapped_args = (script,) + self._unwrap_element_args(args)
+ return self._dispatch("execute_script", (script, self._driver), "execute_script", unwrapped_args)
+
+ def execute_async_script(self, script, *args):
+ unwrapped_args = (script,) + self._unwrap_element_args(args)
+ return self._dispatch("execute_script", (script, self._driver), "execute_async_script", unwrapped_args)
+
+ def close(self):
+ self._dispatch("close", (self._driver,), "close", ())
+
+ def quit(self):
+ self._dispatch("quit", (self._driver,), "quit", ())
+
+ def find_element(self, by=By.ID, value=None):
+ return self._dispatch("find", (by, value, self._driver), "find_element", (by, value))
+
+ def find_elements(self, by=By.ID, value=None):
+ return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value))
+
+ def find_element_by_id(self, id_):
+ return self.find_element(by=By.ID, value=id_)
+
+ def find_elements_by_id(self, id_):
+ return self.find_elements(by=By.ID, value=id_)
+
+ def find_element_by_xpath(self, xpath):
+ return self.find_element(by=By.XPATH, value=xpath)
+
+ def find_elements_by_xpath(self, xpath):
+ return self.find_elements(by=By.XPATH, value=xpath)
+
+ def find_element_by_link_text(self, link_text):
+ return self.find_element(by=By.LINK_TEXT, value=link_text)
+
+ def find_elements_by_link_text(self, text):
+ return self.find_elements(by=By.LINK_TEXT, value=text)
+
+ def find_element_by_partial_link_text(self, link_text):
+ return self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)
+
+ def find_elements_by_partial_link_text(self, link_text):
+ return self.find_elements(by=By.PARTIAL_LINK_TEXT, value=link_text)
+
+ def find_element_by_name(self, name):
+ return self.find_element(by=By.NAME, value=name)
+
+ def find_elements_by_name(self, name):
+ return self.find_elements(by=By.NAME, value=name)
+
+ def find_element_by_tag_name(self, name):
+ return self.find_element(by=By.TAG_NAME, value=name)
+
+ def find_elements_by_tag_name(self, name):
+ return self.find_elements(by=By.TAG_NAME, value=name)
+
+ def find_element_by_class_name(self, name):
+ return self.find_element(by=By.CLASS_NAME, value=name)
+
+ def find_elements_by_class_name(self, name):
+ return self.find_elements(by=By.CLASS_NAME, value=name)
+
+ def find_element_by_css_selector(self, css_selector):
+ return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
+
+ def find_elements_by_css_selector(self, css_selector):
+ return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)
+
+ def _dispatch(self, l_call, l_args, d_call, d_args):
+ getattr(self._listener, "before_%s" % l_call)(*l_args)
+ try:
+ result = getattr(self._driver, d_call)(*d_args)
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+ getattr(self._listener, "after_%s" % l_call)(*l_args)
+ return _wrap_elements(result, self)
+
+ def _unwrap_element_args(self, args):
+ if isinstance(args, EventFiringWebElement):
+ return args.wrapped_element
+ elif isinstance(args, tuple):
+ return tuple([self._unwrap_element_args(item) for item in args])
+ elif isinstance(args, list):
+ return [self._unwrap_element_args(item) for item in args]
+ else:
+ return args
+
+ def __setattr__(self, item, value):
+ if item.startswith("_") or not hasattr(self._driver, item):
+ object.__setattr__(self, item, value)
+ else:
+ try:
+ object.__setattr__(self._driver, item, value)
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+
+ def __getattr__(self, name):
+
+ def _wrap(*args):
+ try:
+ result = attrib(*args)
+ return _wrap_elements(result, self)
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+
+ if hasattr(self._driver, name):
+ try:
+ attrib = getattr(self._driver, name)
+ if not callable(attrib):
+ return attrib
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+ return _wrap
+
+ raise AttributeError(name)
+
+
+class EventFiringWebElement(object):
+ """"
+ A wrapper around WebElement instance which supports firing events
+ """
+
+ def __init__(self, webelement, ef_driver):
+ """
+ Creates a new instance of the EventFiringWebElement
+ """
+ self._webelement = webelement
+ self._ef_driver = ef_driver
+ self._driver = ef_driver.wrapped_driver
+ self._listener = ef_driver._listener
+
+ @property
+ def wrapped_element(self):
+ """Returns the WebElement wrapped by this EventFiringWebElement instance"""
+ return self._webelement
+
+ def click(self):
+ self._dispatch("click", (self._webelement, self._driver), "click", ())
+
+ def clear(self):
+ self._dispatch("change_value_of", (self._webelement, self._driver), "clear", ())
+
+ def send_keys(self, *value):
+ self._dispatch("change_value_of", (self._webelement, self._driver), "send_keys", value)
+
+ def find_element(self, by=By.ID, value=None):
+ return self._dispatch("find", (by, value, self._driver), "find_element", (by, value))
+
+ def find_elements(self, by=By.ID, value=None):
+ return self._dispatch("find", (by, value, self._driver), "find_elements", (by, value))
+
+ def find_element_by_id(self, id_):
+ return self.find_element(by=By.ID, value=id_)
+
+ def find_elements_by_id(self, id_):
+ return self.find_elements(by=By.ID, value=id_)
+
+ def find_element_by_name(self, name):
+ return self.find_element(by=By.NAME, value=name)
+
+ def find_elements_by_name(self, name):
+ return self.find_elements(by=By.NAME, value=name)
+
+ def find_element_by_link_text(self, link_text):
+ return self.find_element(by=By.LINK_TEXT, value=link_text)
+
+ def find_elements_by_link_text(self, link_text):
+ return self.find_elements(by=By.LINK_TEXT, value=link_text)
+
+ def find_element_by_partial_link_text(self, link_text):
+ return self.find_element(by=By.PARTIAL_LINK_TEXT, value=link_text)
+
+ def find_elements_by_partial_link_text(self, link_text):
+ return self.find_elements(by=By.PARTIAL_LINK_TEXT, value=link_text)
+
+ def find_element_by_tag_name(self, name):
+ return self.find_element(by=By.TAG_NAME, value=name)
+
+ def find_elements_by_tag_name(self, name):
+ return self.find_elements(by=By.TAG_NAME, value=name)
+
+ def find_element_by_xpath(self, xpath):
+ return self.find_element(by=By.XPATH, value=xpath)
+
+ def find_elements_by_xpath(self, xpath):
+ return self.find_elements(by=By.XPATH, value=xpath)
+
+ def find_element_by_class_name(self, name):
+ return self.find_element(by=By.CLASS_NAME, value=name)
+
+ def find_elements_by_class_name(self, name):
+ return self.find_elements(by=By.CLASS_NAME, value=name)
+
+ def find_element_by_css_selector(self, css_selector):
+ return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
+
+ def find_elements_by_css_selector(self, css_selector):
+ return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)
+
+ def _dispatch(self, l_call, l_args, d_call, d_args):
+ getattr(self._listener, "before_%s" % l_call)(*l_args)
+ try:
+ result = getattr(self._webelement, d_call)(*d_args)
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+ getattr(self._listener, "after_%s" % l_call)(*l_args)
+ return _wrap_elements(result, self._ef_driver)
+
+ def __setattr__(self, item, value):
+ if item.startswith("_") or not hasattr(self._webelement, item):
+ object.__setattr__(self, item, value)
+ else:
+ try:
+ object.__setattr__(self._webelement, item, value)
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+
+ def __getattr__(self, name):
+
+ def _wrap(*args):
+ try:
+ result = attrib(*args)
+ return _wrap_elements(result, self._ef_driver)
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+
+ if hasattr(self._webelement, name):
+ try:
+ attrib = getattr(self._webelement, name)
+ if not callable(attrib):
+ return attrib
+ except Exception, e:
+ self._listener.on_exception(e, self._driver)
+ raise e
+ return _wrap
+
+ raise AttributeError(name)