11from Selenium2Library import utils
22from robot .api import logger
33from robot .utils import NormalizedDict
4+ from robot .libraries .BuiltIn import BuiltIn
45
56
67class ElementFinder (object ):
@@ -22,6 +23,7 @@ def __init__(self):
2223 'default' : self ._find_by_default
2324 }
2425 self ._strategies = NormalizedDict (initial = strategies , caseless = True , spaceless = True )
26+ self ._default_strategies = strategies .keys ()
2527
2628 def find (self , browser , locator , tag = None ):
2729 assert browser is not None
@@ -35,6 +37,30 @@ def find(self, browser, locator, tag=None):
3537 (tag , constraints ) = self ._get_tag_and_constraints (tag )
3638 return strategy (browser , criteria , tag , constraints )
3739
40+ def register (self , strategy , persist ):
41+ if strategy .name in self ._strategies :
42+ raise AttributeError ("The custom locator '" + strategy .name +
43+ "' cannot be registered. A locator of that name already exists." )
44+ self ._strategies [strategy .name ] = strategy .find
45+
46+ if not persist :
47+ # Unregister after current scope ends
48+ suite = BuiltIn ().get_variable_value ('${SUITE NAME}' )
49+ test = BuiltIn ().get_variable_value ('${TEST NAME}' , '' )
50+ scope = suite + '.' + test if test != '' else suite
51+ utils .events .on ('scope_end' , scope , self .unregister , strategy .name )
52+
53+ def unregister (self , strategy_name ):
54+ if strategy_name in self ._default_strategies :
55+ raise AttributeError ("Cannot unregister the default strategy '" + strategy_name + "'" )
56+ elif strategy_name not in self ._strategies :
57+ logger .info ("Cannot unregister the non-registered strategy '" + strategy_name + "'" )
58+ else :
59+ del self ._strategies [strategy_name ]
60+
61+ def has_strategy (self , strategy_name ):
62+ return strategy_name in self .strategies
63+
3864 # Strategy routines, private
3965
4066 def _find_by_identifier (self , browser , criteria , tag , constraints ):
@@ -90,7 +116,7 @@ def _find_by_tag_name(self, browser, criteria, tag, constraints):
90116 return self ._filter_elements (
91117 browser .find_elements_by_tag_name (criteria ),
92118 tag , constraints )
93-
119+
94120 def _find_by_sc_locator (self , browser , criteria , tag , constraints ):
95121 js = "return isc.AutoTest.getElement('%s')" % criteria .replace ("'" , "\\ '" )
96122 return self ._filter_elements ([browser .execute_script (js )], tag , constraints )
0 commit comments