Skip to content

Commit

Permalink
[qacode] creating control_group , #134 (#184)
Browse files Browse the repository at this point in the history
* [qacode] creating control_group , #134

* [qacode] update CIs + fix flake8 errors

* [qacode] fix nav tests, added SKIP key

*  [qacode] fix controls testcases

* [qacode] fixing tests

+ fix for issue #156 , enable deselect tests for multiple select tag
+ updated settings, added keys for each control package
+ update default log to INFO
+ update USAGE.rst

* [qacode] fix tox flake8 erros

* [qacode]  trying to fix travis py35

* [qacode] removed sonarqube suppot

* [qacode] update packaging dependency, CIs failing

* [qacode] remove assert calls at setup_class
  • Loading branch information
netzulo authored Jul 22, 2018
1 parent 7dc7090 commit 7376893
Show file tree
Hide file tree
Showing 17 changed files with 533 additions and 342 deletions.
13 changes: 3 additions & 10 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,6 @@ env:
- secure: Cb5inPwNlfEREkhKa17tgThrTvFWV+RgfbIX3o2JZQ0Re9dlwNOoxxTd2NrYyRAWSj0LK/Dmev+wG56Jxovva2Kqt+xfpVF2y8C1BCNQlAXY4unoKy3pQ4dyk+iW2qHM0UuZDbyxLofPEKPi7GgoR/77fhdxHgvKPBRG1WixcDyz3NAjjP86M02gv5gY48S6DRPTGKX4kFii/VyEMpM62AKJBFvf6/NAB06E0zuV7l/DZn7JEYQ68upmB7CwhNA5NCMUqX1dVkGpSi4WFrCF2L38uIXDF8JF9nAJ8Cm9dZQobvTRGCeJHU+5t8a2q93zGcTae1147IqqmhbYvpW/69bzlsDsiv90Eg65yOYw8pUkY3FyX0r7jsm1Mo0tap8lYshh7Hc6VYcmDsaAp/XqHJOQWGwW3q6f694D8qe6jxxYMjXnfOuXJfQN/TmvrD++YHwxv1RPkpVXsmEL+IyuoY4PoY3oDRyX6CZ4HDn3zbp3S9Pv2jCGn0JVgZyXZY3lN/9AWPy3XPxuiPNOL8D6Y/dsJxhL4mCzRE3NlZ2m93RVk3mXLAbErwaAisglscpMb9/NDAydDsy8cuXK7Qq5anAfi516GJYr03zzEvz3KAxy3Dcxc1p4CQp65dnvnLgQqQpr/I0GmPRWUnCZSvOf5L5WuG0as8tM1CtD5A89aqI=
# GITHUB_TOKEN
- secure: LYqe4kN1i8BqVEAO8fdO+CYrx9z8h1ab+NxCgYubLcP70DZoKNRj1/egULOd3uvDHFigFVeaACRR6vUQnHbHsffSkMr4nqwOeJMbxOdspHPuA4oMUy5RZKRC7P+v6Dlwpg4Psg/VsEnP6lHWb/RbosBE8tU8ukewD14EU3o29Ql+lBfvvOW/81UTGokMQa1zrW9o70oEaTYqePT9YzM9UcKgukshYtcxKE3oiwLm3fB8zBAUJwzkEvBGNpXjqBEDCUjrS80CqgY3BRsPfnPk90LgjeORaZKoP1f/bZE4UtgeESK0xpWsKEcDCRkSfGxYw8rD7nwc6H5LiCeoS87oQpUCMsoijmGL1yLrBBMIRAWoMC/o+h/QI5bb+IyLba6KLihY4LpExnWj2V8Mh6qs6AeV8v/Dl1WdyIi72WIkMBrmVrOhtoJJ45QaZJbrwSMeM4/ShS5NdiLFnGKeYOjMJ+DQZa+//SIwnvsOegm918TmOZqCr2YabI6WYixOzYjQPvI2KliZGekaX9uSNxVwoWZDE8jvdhvBWtHsL6hMqAv5ehEJw1aseLwjEGHQjIY0YBqJI38QmFr0vro6/9U2EehXHeW3ycCrPguQJ50nIK/DwiGMadUhrxU0xfZ6+TfFpGY0RivEPLD+Cup9C5oVFAppPJncdBdXUqouR90/8NI=
addons:
sonarqube:
branches:
- master
language: python
matrix:
include:
Expand All @@ -30,14 +26,11 @@ matrix:

before_install:
- pip freeze
# Fix for python3.5
- pip uninstall --yes packaging
# qacode setup required
- pip install qautils
install:
- pip install tox
script:
- tox -e "{$TOXENV},flake8"
after_script:
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
sonar-scanner -X -Dsonar.login=${SONAR_GITHUB_TOKEN} -Dsonar.host.url=http://qalab.tk:82 ;
else
sonar-scanner -X -Dsonar.login=${SONAR_GITHUB_TOKEN} -Dsonar.host.url=http://qalab.tk:82 -Dsonar.github.repository=netzulo/qacode -Dsonar.github.pullRequest=${TRAVIS_PULL_REQUEST} -Dsonar.github.oauth=${GITHUB_TOKEN} -Dsonar.analysis.mode=preview ;
fi
27 changes: 0 additions & 27 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,33 +35,6 @@ Python tested versions
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+


Code Metrics by sonarqube
~~~~~~~~~~~~~~~~~~~~~~~~~

.. image:: http://qalab.tk:82/api/badges/gate?key=qacode
:alt: Quality Gate
:target: http://qalab.tk:82/api/badges/gate?key=qacode
.. image:: http://qalab.tk:82/api/badges/measure?key=qacode&metric=lines
:alt: Lines
:target: http://qalab.tk:82/api/badges/gate?key=qacode
.. image:: http://qalab.tk:82/api/badges/measure?key=qacode&metric=bugs
:alt: Bugs
:target: http://qalab.tk:82/api/badges/gate?key=qacode
.. image:: http://qalab.tk:82/api/badges/measure?key=qacode&metric=vulnerabilities
:alt: Vulnerabilities
:target: http://qalab.tk:82/api/badges/gate?key=qacode
.. image:: http://qalab.tk:82/api/badges/measure?key=qacode&metric=code_smells
:alt: Code Smells
:target: http://qalab.tk:82/api/badges/gate?key=qacode
.. image:: http://qalab.tk:82/api/badges/measure?key=qacode&metric=sqale_debt_ratio
:alt: Debt ratio
:target: http://qalab.tk:82/api/badges/gate?key=qacode
.. image:: http://qalab.tk:82/api/badges/measure?key=qacode&metric=comment_lines_density
:alt: Comments
:target: http://qalab.tk:82/api/badges/gate?key=qacode



Prerequisites
-------------

Expand Down
7 changes: 6 additions & 1 deletion USAGE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ It's base control to load web element from ``WebDriver + browser session`` , *th
+ Param **locator** : This text it's parsed down selenium class ``selenium.webdriver.common.by.By`` (*default:* ``css selector`` == ``By.CSS_SELECTOR``)
+ 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 Down Expand Up @@ -119,6 +118,12 @@ ControlForm
+ Param **strict_rules** : Allow to add strict_rules configuration to laod StrictRule class for each rule ( example: ``strict_rule = StrictRule('my_named_rule', StrictType.TAG, StrictSeverity.HIGHT)`` )


ControlGroup
~~~~~~~~~~~~

+ Param **on_instance_group** : by default it's disabled, at enable raises when strict_rules type warning logs message with 'hight severity' or when type error log messages with 'medium or more severity'
+ Param **group** : allow to track all ControlBase elements using `elements` (*instances of WebElement*) and `group` (*instances of ControlBase*) properties

Pages
-----

Expand Down
120 changes: 61 additions & 59 deletions qacode/configs/settings.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{ "bot": {
"log_output_file": "logs/",
"log_name": "qacode",
"log_level": "DEBUG",
"log_level": "INFO",
"mode": "remote",
"browser": "chrome",
"options": { "headless": false },
"url_hub": "http://qalab.tk:11000/wd/hub",
"url_hub": "http://ntz-qa.tk:11000/wd/hub",
"drivers_path": "../qadrivers",
"drivers_names": [
"chromedriver_32.exe",
Expand All @@ -28,7 +28,7 @@
},
"testlink": {
"enabled": false,
"url_api": "http://qalab.tk:86/lib/api/xmlrpc/v1/xmlrpc.php",
"url_api": "http://ntz-qa.tk:86/lib/api/xmlrpc/v1/xmlrpc.php",
"dev_key": "ae2f4839476bea169f7461d74b0ed0ac",
"data":{
"generate": false,
Expand All @@ -44,106 +44,108 @@
"drivers_remote": false,
"bot_multiple": false,
"bot_unique": false,
"web_controls": false,
"bot_navigations": false,
"web_controls": {
"control_base": false,
"control_form": false,
"control_group": false
},
"web_pages": false,
"benchmarks": true
},
"apps": [
{
"name": "nav_tests",
"pages": [
{
"name": "nav_tests_home",
"url": "http://the-internet.herokuapp.com/",
"locator": "css selector",
"go_url": false,
"wait_url": 0,
"maximize": false,
"controls": []
}
]
},
{
"name": "pages_tests",
{ "name": "qadmin",
"pages": [
{
"name": "page_base",
"url": "http://the-internet.herokuapp.com/",
{ "name": "qacode_login",
"url": "http://ntz-qa.tk:83/qacode/login",
"locator": "css selector",
"go_url": false,
"wait_url": 0,
"maximize": false,
"controls": []
},
{
"name": "page_login",
"url": "http://the-internet.herokuapp.com/login",
"locator": "css selector",
"go_url": true,
"wait_url": 0,
"maximize": false,
"controls": [
{
"name": "txt_username",
"locator": "css selector",
"selector": "#username",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
},
{
"name": "txt_password",
{ "name": "form_login",
"locator": "css selector",
"selector": "#password",
"selector": "#frmLogin",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
},
{
"name": "btn_submit",
{ "name": "txt_username",
"locator": "css selector",
"selector": "button[type='submit']",
"selector": "#txtUsername-field",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
},
{
"name": "login_container",
{ "name": "txt_password",
"locator": "css selector",
"selector": "#content",
"selector": "#txtPassword-field",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
},
{
"name": "login_container_title",
{ "name": "btn_submit",
"locator": "css selector",
"selector": "h2",
"selector": "#btnLogin",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": false
}
]
},
{
"name": "page_dropdown",
"url": "http://the-internet.herokuapp.com/dropdown",
{ "name": "qacode_inputs",
"url": "http://ntz-qa.tk:83/qacode/forms/inputs",
"locator": "css selector",
"go_url": true,
"go_url": false,
"wait_url": 0,
"maximize": false,
"controls": [
{
"name": "dropdown",
{ "name": "dd_base",
"locator": "css selector",
"selector": "#dropdown",
"selector": "#txtTest002",
"instance": "ControlForm",
"on_instance_search": true,
"on_instance_load": true,
"on_instance_strict": true,
"strict_rules": [
{ "tag": "select", "type": "tag", "severity": "hight" }
]
},
{ "name": "dd_multiple",
"locator": "css selector",
"selector": "#txtTest003",
"instance": "ControlForm",
"on_instance_search": true,
"on_instance_load": true,
"on_instance_strict": true,
"strict_rules": [
{ "tag": "select", "type": "tag", "severity": "hight" }
]
}
]
},
{ "name": "qacode_logout",
"url": "http://ntz-qa.tk:83/qacode/logout",
"locator": "css selector",
"go_url": true,
"wait_url": 0,
"maximize": false,
"controls": [
{ "name": "btn_logout",
"locator": "css selector",
"selector": "a[href='/qacode/logout']",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": true,
"on_instance_strict": true
},
{ "name": "btn_login",
"locator": "css selector",
"selector": "a[href='/qacode/login']",
"instance": "ControlBase",
"on_instance_search": true,
"on_instance_load": true,
"on_instance_strict": true
}
]
}
Expand Down
3 changes: 2 additions & 1 deletion qacode/core/webs/controls/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from qacode.core.webs.controls import control_base
from qacode.core.webs.controls import control_form
from qacode.core.webs.controls import control_group


__all__ = ['control_base', 'control_form']
__all__ = ['control_base', 'control_form', 'control_group']
32 changes: 13 additions & 19 deletions qacode/core/webs/controls/control_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,9 @@ 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 @@ -76,7 +74,6 @@ 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 Down Expand Up @@ -108,29 +105,26 @@ def _load_search(self, enabled=False, selector_multiple_pos=0):
return False
self.bot.log.debug("control | _load_search: searching element...")
try:
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)
self.element = self.bot.navigation.find_element(
self.selector, locator=self.locator)
except CoreException:
self.bot.log.warning(
"control | _load_search: waiting for element...")
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.element = self.bot.navigation.find_element_wait(
self.selector, locator=self.locator)
self.bot.log.debug("control | _load_search: element found!")
return True

def _load_properties(self, enabled=False):
"""Load default properties for base element
Keyword Arguments:
enabled {bool} -- load at enabled (default: {False})
Raises:
ControlException -- if enabled and settings
haven't key on_instance_search
"""
if enabled and not self.settings.get('on_instance_search'):
msg = ("Can't call to load_properties "
"wihout call first to load_search")
Expand Down
1 change: 0 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,6 @@ def load_settings_keys(self, settings, update=False):
("on_instance_search", False),
("on_instance_load", False),
("auto_reload", True),
("selector_multiple", False),
("instance", 'ControlForm'),
("on_instance_strict", False),
("strict_rules", []),
Expand Down
Loading

0 comments on commit 7376893

Please sign in to comment.