Robot Framework SeleniumLibrary
__init__.py
Go to the documentation of this file.
1 # Copyright 2008-2011 Nokia Networks
2 # Copyright 2011-2016 Ryan Tomac, Ed Manlove and contributors
3 # Copyright 2016- Robot Framework Foundation
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 
17 from collections import namedtuple
18 from inspect import isclass
19 
20 from robot.api import logger
21 from robot.errors import DataError
22 from robot.libraries.BuiltIn import BuiltIn
23 from robot.utils.importer import Importer
24 
25 from SeleniumLibrary.base import DynamicCore, LibraryComponent
26 from SeleniumLibrary.errors import NoOpenBrowser, PluginError
27 from SeleniumLibrary.keywords import (AlertKeywords,
28  BrowserManagementKeywords,
29  CookieKeywords,
30  ElementKeywords,
31  FormElementKeywords,
32  FrameKeywords,
33  JavaScriptKeywords,
34  RunOnFailureKeywords,
35  ScreenshotKeywords,
36  SelectElementKeywords,
37  TableElementKeywords,
38  WaitingKeywords,
39  WebDriverCache,
40  WindowKeywords)
41 from SeleniumLibrary.locators import ElementFinder
42 from SeleniumLibrary.utils import LibraryListener, timestr_to_secs, is_truthy
43 
44 
45 __version__ = '4.0.0a2.dev1'
46 
47 
48 
344 class SeleniumLibrary(DynamicCore):
345  ROBOT_LIBRARY_SCOPE = 'GLOBAL'
346  ROBOT_LIBRARY_VERSION = __version__
347 
348 
365  def __init__(self, timeout=5.0, implicit_wait=0.0,
366  run_on_failure='Capture Page Screenshot',
367  screenshot_root_directory=None, plugins=None,
368  event_firing_webdriver=None):
369  self.timeouttimeout = timestr_to_secs(timeout)
370  self.implicit_waitimplicit_wait = timestr_to_secs(implicit_wait)
371  self.speedspeed = 0.0
372  self.run_on_failure_keyword \
373  = RunOnFailureKeywords.resolve_keyword(run_on_failure)
374  self._running_on_failure_keyword_running_on_failure_keyword = False
375  self.screenshot_root_directoryscreenshot_root_directory = screenshot_root_directory
376  self._element_finder_element_finder = ElementFinder(self)
377  self._plugin_keywords_plugin_keywords = []
378  libraries = [
379  AlertKeywords(self),
380  BrowserManagementKeywords(self),
381  CookieKeywords(self),
382  ElementKeywords(self),
383  FormElementKeywords(self),
384  FrameKeywords(self),
385  JavaScriptKeywords(self),
386  RunOnFailureKeywords(self),
387  ScreenshotKeywords(self),
388  SelectElementKeywords(self),
389  TableElementKeywords(self),
390  WaitingKeywords(self),
391  WindowKeywords(self)
392  ]
393  if is_truthy(plugins):
394  plugin_libs = self._parse_plugins_parse_plugins(plugins)
395  libraries = libraries + plugin_libs
396  self._drivers_drivers = WebDriverCache()
397  DynamicCore.__init__(self, libraries)
398  self.ROBOT_LIBRARY_LISTENERROBOT_LIBRARY_LISTENER = LibraryListener()
399  if is_truthy(event_firing_webdriver):
400  self.event_firing_webdriverevent_firing_webdriver = self._parse_listener_parse_listener(event_firing_webdriver)
401  else:
402  self.event_firing_webdriverevent_firing_webdriver = None
403 
404  def run_keyword(self, name, args, kwargs):
405  try:
406  return DynamicCore.run_keyword(self, name, args, kwargs)
407  except Exception:
408  self.failure_occurredfailure_occurred()
409  raise
410 
411  def get_keyword_tags(self, name):
412  tags = list(DynamicCore.get_keyword_tags(self, name))
413  if name in self._plugin_keywords_plugin_keywords:
414  tags.append('plugin')
415  return tags
416 
417 
426  def register_driver(self, driver, alias):
427  return self._drivers_drivers.register(driver, alias)
428 
429 
435  def failure_occurred(self):
436  if self._running_on_failure_keyword_running_on_failure_keyword or not self.run_on_failure_keyword:
437  return
438  try:
439  self._running_on_failure_keyword_running_on_failure_keyword = True
440  BuiltIn().run_keyword(self.run_on_failure_keyword)
441  except Exception as err:
442  logger.warn("Keyword '%s' could not be run on failure: %s"
443  % (self.run_on_failure_keyword, err))
444  finally:
445  self._running_on_failure_keyword_running_on_failure_keyword = False
446 
447  @property
448 
453  driver = property
454 
455  def driver(self):
456  if not self._drivers_drivers.current:
457  raise NoOpenBrowser('No browser is open.')
458  return self._drivers_drivers.current
459 
460 
472  def find_element(self, locator, parent=None):
473  return self._element_finder_element_finder.find(locator, parent=parent)
474 
475 
486  def find_elements(self, locator, parent=None):
487  return self._element_finder_element_finder.find(locator, first_only=False,
488  required=False, parent=parent)
489 
490  def _parse_plugins(self, plugins):
491  libraries = []
492  importer = Importer('test library')
493  for parsed_plugin in self._string_to_modules_string_to_modules(plugins):
494  plugin = importer.import_class_or_module(parsed_plugin.module)
495  if not isclass(plugin):
496  message = "Importing test library: '%s' failed." % parsed_plugin.module
497  raise DataError(message)
498  plugin = plugin(self, *parsed_plugin.args,
499  **parsed_plugin.kw_args)
500  if not isinstance(plugin, LibraryComponent):
501  message = 'Plugin does not inherit SeleniumLibrary.base.LibraryComponent'
502  raise PluginError(message)
503  self._store_plugin_keywords_store_plugin_keywords(plugin)
504  libraries.append(plugin)
505  return libraries
506 
507  def _parse_listener(self, event_firing_webdriver):
508  listener_module = self._string_to_modules_string_to_modules(event_firing_webdriver)
509  listener_count = len(listener_module )
510  if listener_count > 1:
511  message = 'Is is possible import only one listener but there was %s listeners.' % listener_count
512  raise ValueError(message)
513  listener_module = listener_module[0]
514  importer = Importer('test library')
515  listener = importer.import_class_or_module(listener_module.module)
516  if not isclass(listener):
517  message = "Importing test Selenium lister class '%s' failed." % listener_module.module
518  raise DataError(message)
519  return listener
520 
521  def _string_to_modules(self, modules):
522  Module = namedtuple('Module', 'module, args, kw_args')
523  parsed_modules = []
524  for module in modules.split(','):
525  module = module.strip()
526  module_and_args = module.split(';')
527  module_name = module_and_args.pop(0)
528  kw_args = {}
529  args = []
530  for argument in module_and_args:
531  if '=' in argument:
532  key, value = argument.split('=')
533  kw_args[key] = value
534  else:
535  args.append(argument)
536  module = Module(module=module_name, args=args, kw_args=kw_args)
537  parsed_modules.append(module)
538  return parsed_modules
539 
540  def _store_plugin_keywords(self, plugin):
541  dynamic_core = DynamicCore([plugin])
542  self._plugin_keywords_plugin_keywords.extend(dynamic_core.get_keyword_names())
SeleniumLibrary is a web testing library for Robot Framework.
Definition: __init__.py:344
def get_keyword_tags(self, name)
Definition: __init__.py:411
def __init__(self, timeout=5.0, implicit_wait=0.0, run_on_failure='Capture Page Screenshot', screenshot_root_directory=None, plugins=None, event_firing_webdriver=None)
SeleniumLibrary can be imported with several optional arguments.
Definition: __init__.py:368
def _parse_plugins(self, plugins)
Definition: __init__.py:490
def failure_occurred(self)
Method that is executed when a SeleniumLibrary keyword fails.
Definition: __init__.py:435
def _string_to_modules(self, modules)
Definition: __init__.py:521
def find_elements(self, locator, parent=None)
Find all elements matching locator.
Definition: __init__.py:486
def _parse_listener(self, event_firing_webdriver)
Definition: __init__.py:507
def _store_plugin_keywords(self, plugin)
Definition: __init__.py:540
def register_driver(self, driver, alias)
Add's a driver to the library WebDriverCache.
Definition: __init__.py:426
driver
Current active driver.
Definition: __init__.py:453
def run_keyword(self, name, args, kwargs)
Definition: __init__.py:404
def find_element(self, locator, parent=None)
Find element matching locator.
Definition: __init__.py:472