Skip to content

Commit

Permalink
[qacode] PR for Issue159 (#163)
Browse files Browse the repository at this point in the history
* [qacode] fix not auto reload element

* [qacode] fixing for issue #159

+ added multiple selector wait function to navigations
+ added new default keys to controls settings dicts
+ fix bad instance name for ControlForm
+ fix, added instance property to controls
- test , fix, not checking instance property at controls tests
+ update USAGE.rst documentation
  • Loading branch information
netzulo authored Jun 9, 2018
1 parent 72bd8d4 commit c4efb39
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 28 deletions.
29 changes: 11 additions & 18 deletions USAGE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,12 @@ ControlBase

It's base control to load web element from ``WebDriver + browser session`` , *this class must be use to inherit new* `ControlAwesome` *classes*

+ Param **name** : allows to set value to ``ControlBase.name`` property, also it's used by pages to set property page with ``control.name`` value
+ Param **selector** (**REQUIRED**): Valid selector for locator selected
+ Param **name** : Allows to set value to ``ControlBase.name`` property, also it's used by pages to set property page with ``control.name`` value
+ Param **locator** : This text it's parsed down selenium class ``selenium.webdriver.common.by.By`` (*default:* ``css selector`` == ``By.CSS_SELECTOR``)
+ Param **selector** : valid selector for locator selected
+ Param **instance** : allow to generate your own inherit classes from ``ControlBase`` and instance them using qacode strategy (*default:* ``ControlBase``)
+ Param **instance** : Allow to generate your own inherit classes from ``ControlBase`` and instance them using qacode strategy (*default:* ``ControlBase``)
+ Param **auto_reload** : Allow to reload element searching first when need to use some function of control instance and isn't loaded (*default:* ``True``)
+ Param **selector_multiple** : allow to search multiple elements with one selectors, first is loaded down ``control.element`` , and all elements will be added to ``control.elements`` list (*default:* ``False``)
+ Param **on_instance_search** : enable searching element at instance `ControlBase` (*default:* `False`)
+ Param **on_instance_load** : enable loading ``ControlBase`` properties when element it's loaded (*default:* ``False``) , will need enabled if want to access to base properties values obtained from selenium methods at ``BotBase.navigation``

Expand All @@ -80,29 +82,20 @@ Example of usage
SETTINGS = settings()
CONTROLS = [
{
"name": "txt_username",
"locator": "css selector",
"selector": "#username",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
"name": "txt_username", "selector": "#username"
},
{
"name": "txt_password",
"locator": "css selector",
"selector": "#password",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
"name": "txt_password", "selector": "#password"
},
{
"name": "btn_submit",
"locator": "css selector",
"selector": "button[type='submit']",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
},
"on_instance_search": false,
"on_instance_load": false,
"auto_reload": True,
}
]
# Open bot now
Expand Down
30 changes: 30 additions & 0 deletions qacode/core/bots/modules/nav_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,36 @@ def find_element_wait(self, selector,
return driver_wait.until(
EC.presence_of_element_located((locator, selector)))

def find_elements_wait(self, selector,
locator=By.CSS_SELECTOR, driver_wait=None):
"""Search elements using WebDriverWait class
and ElementConditions presence_of_all_elements_located
Arguments:
selector {str} -- string selector used to locate
multiple elements
Keyword Arguments:
locator {By} -- locator strategy used to find
WebElement selector (default: {By.CSS_SELECTOR})
driver_wait {WebDriverWait} -- driver that supports
ExpectedConditions methods (default: {None})
Raises:
CoreException -- if NavBase instanced
without driver_wait
Returns:
WebElement -- element through selenium
WebDriverWait class
"""
if driver_wait is None and self.driver_wait is None:
raise CoreException(message='Nav instanced without driver_wait')
if driver_wait is None:
driver_wait = self.driver_wait
return driver_wait.until(
EC.presence_of_all_elements_located((locator, selector)))

def forward(self):
"""Go forward using browser functionality"""
self.driver.forward()
Expand Down
26 changes: 21 additions & 5 deletions qacode/core/webs/controls/control_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@ class ControlBase(object):
on_instance_search = None
on_instance_load = None
auto_reload = None
selector_multiple = None
instance = None
# Element properties
element = None
elements = None
tag = None
text = None
is_displayed = None
Expand Down Expand Up @@ -73,6 +76,7 @@ def load_settings_keys(self, settings, update=False, default_keys=None):
("on_instance_search", False),
("on_instance_load", False),
("auto_reload", True),
("selector_multiple", False),
("instance", 'ControlBase')
]
default_settings = defaultdict(list, default_keys)
Expand All @@ -97,20 +101,32 @@ def load_settings_keys(self, settings, update=False, default_keys=None):
self.settings = updated_settings
self.bot.log.debug("control | load_settings_keys: loaded keys!")

def _load_search(self, enabled=False):
def _load_search(self, enabled=False, selector_multiple_pos=0):
if not enabled or enabled is None:
self.bot.log.warning(
"control | _load_search: !Disabled searching element!")
return False
self.bot.log.debug("control | _load_search: searching element...")
try:
self.element = self.bot.navigation.find_element(
self.selector, locator=self.locator)
if self.selector_multiple:
self.bot.log.debug(("control | _load_search:"
" searching multiple elements..."))
self.elements = self.bot.navigation.find_elements(
self.selector, locator=self.locator)
self.element = self.elements[selector_multiple_pos]
else:
self.element = self.bot.navigation.find_element(
self.selector, locator=self.locator)
except CoreException:
self.bot.log.warning(
"control | _load_search: waiting for element...")
self.element = self.bot.navigation.find_element_wait(
self.selector, locator=self.locator)
if self.selector_multiple:
self.elements = self.bot.navigation.find_elements_wait(
self.selector, locator=self.locator)
self.element = self.elements[selector_multiple_pos]
else:
self.element = self.bot.navigation.find_element_wait(
self.selector, locator=self.locator)
self.bot.log.debug("control | _load_search: element found!")
return True

Expand Down
4 changes: 3 additions & 1 deletion qacode/core/webs/controls/control_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ def load_settings_keys(self, settings, update=False):
("on_instance_search", False),
("on_instance_load", False),
("auto_reload", True),
("instance", 'ControlBase'),
("selector_multiple", False),
("instance", 'ControlForm'),
("on_instance_strict", False),
("strict_rules", []),
]
Expand Down Expand Up @@ -298,6 +299,7 @@ def reload(self, **kwargs):
"control_form | reload: reloading control...")
# load settings again
config = kwargs.copy()
config.update(self.RELOAD_CONFIG)
# needed for self._load_* functions
self.load_settings_keys(config, update=True)
# instance logic
Expand Down
15 changes: 13 additions & 2 deletions tests/001_functionals/suite_005_controlbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ def setup_method(self, test_method):
@pytest.mark.parametrize("on_instance_search", [False, True])
@pytest.mark.parametrize("on_instance_load", [False, True])
@pytest.mark.parametrize("auto_reload", [True])
@pytest.mark.parametrize("selector_multiple", [False])
def test_instance_base(self, selector, instance, on_instance_search,
on_instance_load, auto_reload):
on_instance_load, auto_reload, selector_multiple):
"""Testcase: test_instance_base"""
# must be supported at: test_instance_raises_base
if not on_instance_search and on_instance_load:
Expand All @@ -63,6 +64,7 @@ def test_instance_base(self, selector, instance, on_instance_search,
"on_instance_search": on_instance_search,
"on_instance_load": on_instance_load,
"auto_reload": auto_reload,
"selector_multiple": selector_multiple
}
control = ControlBase(self.bot, **control_config)
self.assert_is_instance(control, ControlBase)
Expand All @@ -88,15 +90,23 @@ def test_instance_base(self, selector, instance, on_instance_search,
self.assert_equals(
control.auto_reload,
control_config.get('auto_reload'))
self.assert_equals(
control.selector_multiple,
control_config.get('selector_multiple'))
self.assert_equals(
control.instance,
control_config.get('instance'))

@pytest.mark.skipIf(SKIP_CONTROLS, SKIP_CONTROLS_MSG)
@pytest.mark.parametrize("on_instance_load", [None])
@pytest.mark.parametrize("on_instance_search", [None, True])
@pytest.mark.parametrize("instance", ["ControlBase"])
@pytest.mark.parametrize("selector", [None, "#username"])
@pytest.mark.parametrize("auto_reload", [False])
@pytest.mark.parametrize("selector_multiple", [False])
def test_instance_base_raises(self, selector, instance, on_instance_search,
on_instance_load, auto_reload):
on_instance_load, auto_reload,
selector_multiple):
"""Testcase: test_instance_raises_base"""
# must be supported at: test_instance_base
if on_instance_search and on_instance_load is None:
Expand All @@ -110,6 +120,7 @@ def test_instance_base_raises(self, selector, instance, on_instance_search,
"on_instance_search": on_instance_search,
"on_instance_load": on_instance_load,
"auto_reload": auto_reload,
"selector_multiple": selector_multiple
}
if (
on_instance_search is None and
Expand Down
17 changes: 15 additions & 2 deletions tests/001_functionals/suite_006_controlform.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def setup_method(self, test_method):
@pytest.mark.parametrize("on_instance_search", [True])
@pytest.mark.parametrize("on_instance_load", [True])
@pytest.mark.parametrize("auto_reload", [True])
@pytest.mark.parametrize("selector_multiple", [False])
@pytest.mark.parametrize("on_instance_strict", [True, False])
@pytest.mark.parametrize("strict_rules", [
[
Expand All @@ -61,7 +62,7 @@ def setup_method(self, test_method):
])
def test_instance_form(self, selector, instance, on_instance_search,
on_instance_load, on_instance_strict, strict_rules,
auto_reload):
auto_reload, selector_multiple):
"""Testcase: test_001_instance_selector"""
control_config = {
"name": "txt_username_strict",
Expand All @@ -71,6 +72,7 @@ def test_instance_form(self, selector, instance, on_instance_search,
"on_instance_search": on_instance_search,
"on_instance_load": on_instance_load,
"auto_reload": auto_reload,
"selector_multiple": selector_multiple,
"on_instance_strict": on_instance_strict,
"strict_rules": strict_rules
}
Expand All @@ -93,6 +95,12 @@ def test_instance_form(self, selector, instance, on_instance_search,
self.assert_equals(
control.auto_reload,
control_config.get('auto_reload'))
self.assert_equals(
control.selector_multiple,
control_config.get('selector_multiple'))
self.assert_equals(
control.instance,
control_config.get('instance'))
self.assert_equals(
control.on_instance_strict,
control_config.get('on_instance_strict'))
Expand All @@ -110,14 +118,19 @@ def test_instance_form(self, selector, instance, on_instance_search,
@pytest.mark.skipIf(SKIP_CONTROLS, SKIP_CONTROLS_MSG)
@pytest.mark.parametrize("selector", ["#dropdown"])
@pytest.mark.parametrize("instance", ["ControlForm"])
def test_method_reload_form(self, selector, instance):
@pytest.mark.parametrize("auto_reload", [True])
@pytest.mark.parametrize("selector_multiple", [False])
def test_method_reload_form(self, selector, instance,
auto_reload, selector_multiple):
"""Testcase: test_method_setcssrule"""
# must be supported
control_config = {
"name": "txt_username_base",
"locator": "css selector",
"selector": selector,
"instance": instance,
"auto_reload": auto_reload,
"selector_multiple": selector_multiple,
"on_instance_search": False,
"on_instance_load": False,
"on_instance_strict": False,
Expand Down

0 comments on commit c4efb39

Please sign in to comment.