diff --git a/CHANGELOG.md b/CHANGELOG.md index c727cceb..67400bbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - New nav_base method named ele_wait_value #untracked - Move dropdown methods to new control dropdown class #258 - Added new class named 'ControlTable' #248 +- Add coverage tests for function: driver_name_filter #268 ### Changed - Separate benchmark test from all functional tests at tox -e coverage #251 @@ -21,6 +22,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Now get_text check for input tag #untracked - Function with Cognitive Complexity of 13 (exceeds 5 allowed) #265 - New internal method to reduce duplication at ControlDropdown #untracked +- Fix similar code at #271 ### Fixed - Can't use dropdown methods if ControlForm strict_tags is disabled #247 @@ -32,6 +34,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Removed - Deleted ControlGroup + tests #256 - Deleted controls property named 'on_instance_load' #259 +- Deleted opera support #270 ## [v0.6.0] - 2019-03-18 diff --git a/README.rst b/README.rst index 34330709..dfcb878c 100755 --- a/README.rst +++ b/README.rst @@ -102,11 +102,7 @@ Configuration File "iexplorerdriver_32.exe", "iexplorerdriver_64.exe", "edgedriver_32.exe", - "edgedriver_64.exe", - "operadriver_32.exe", - "operadriver_64.exe", - "operadriver_32", - "operadriver_64" + "edgedriver_64.exe" ] } } diff --git a/USAGE.rst b/USAGE.rst index ad9f2226..bd436a6b 100644 --- a/USAGE.rst +++ b/USAGE.rst @@ -39,11 +39,7 @@ Have classes for this down package: ``qacode.core.bots`` "iexplorerdriver_32.exe", "iexplorerdriver_64.exe", "edgedriver_32.exe", - "edgedriver_64.exe", - "operadriver_32.exe", - "operadriver_64.exe", - "operadriver_32", - "operadriver_64" + "edgedriver_64.exe" ] } } @@ -156,6 +152,24 @@ ControlDropdown + method **deselect** : The Select class only works with tags which have select tags + method **deselect_all** : The Select class only works with tags which have select tags with multiple="multiple" attribute. +ControlTable +~~~~~~~~~~~~ + +- Methods for **ControlTable** + + + method **__check_reload__form__** : Allow to check before methods calls to ensure if it's neccessary reload element properties + + method **__load_table__** : Allow to load all TR > TD items from a TABLE element + + method **__load_table_html4__** : Allow to load table with this structure ``TABLE > (TR > TH)+(TR > TD)`` + + method **__load_table_html5__** : Allow to load table with this structure ``TABLE > (THEAD > (TR > TH))+(TBODY > (TR > TH))`` + + method **__get_row__** : Allow to get cells of a element + + method **__try__** : Allow to exec some method to handle exception + + method **reload** : Reload 'self.settings' property:dict and call to instance logic with new configuration + +- Properties for **ControlTable** + + + property **table**: GET / SET for table element ( *just a ``WebElement`` based on ``table`` tag*) + + property **rows**: GET for rows cells based on controls instances + Pages ----- diff --git a/qacode/configs/settings.json b/qacode/configs/settings.json index ab75a18d..3241a765 100644 --- a/qacode/configs/settings.json +++ b/qacode/configs/settings.json @@ -14,7 +14,7 @@ "chromedriver_64", "firefoxdriver_32.exe", "firefoxdriver_64.exe", - "firefoxdriver_64.exe", + "firefoxdriver_64", "firefoxdriver_32", "iexplorerdriver_32.exe", "iexplorerdriver_64.exe", diff --git a/qacode/core/bots/bot_base.py b/qacode/core/bots/bot_base.py index 024718b9..603b6d4e 100644 --- a/qacode/core/bots/bot_base.py +++ b/qacode/core/bots/bot_base.py @@ -14,7 +14,6 @@ from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.touch_actions import TouchActions from selenium.webdriver.firefox.options import Options as FirefoxOptions -from selenium.webdriver.opera.options import Options as OperaOptions from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver from selenium.webdriver.support.ui import WebDriverWait @@ -156,13 +155,23 @@ class instanced for one browser "firefox": DesiredCapabilities.FIREFOX.copy(), "iexplorer": DesiredCapabilities.INTERNETEXPLORER.copy(), "edge": DesiredCapabilities.EDGE.copy(), - "opera": DesiredCapabilities.OPERA.copy(), }[browser_name] except KeyError: msg = 'Bad browser selected at load options' raise CoreException(msg=msg, log=self.log) return capabilities + def __check_driver_ready__(self, driver_path, capabilities, options): + """Some checks to ensure driver path, caps and options + are ready to be used + """ + if driver_path is None: + driver_path = self.curr_driver_path + if capabilities is None: + capabilities = self.curr_caps + if options is None: + options = self.curr_options + def get_options(self, browser_name='chrome', headless_enabled=False): """Instance Options class from selenium and return it @@ -186,7 +195,6 @@ class instanced for one browser options = { "chrome": ChromeOptions(), "firefox": FirefoxOptions(), - "opera": OperaOptions(), }[browser_name] if headless_enabled: options.add_argument("--headless") @@ -245,12 +253,7 @@ def get_driver_chrome(self, driver_path=None, capabilities=None, Returns: [WebDriver.Chrome] -- WebDriver opened and ready to be used """ - if driver_path is None: - driver_path = self.curr_driver_path - if capabilities is None: - capabilities = self.curr_caps - if options is None: - options = self.curr_options + self.__check_driver_ready__(driver_path, capabilities, options) return WebDriver.Chrome( executable_path=driver_path, desired_capabilities=capabilities, @@ -270,12 +273,7 @@ def get_driver_firefox(self, driver_path=None, capabilities=None, Returns: [WebDriver.Firefox] -- WebDriver opened and ready to be used """ - if driver_path is None: - driver_path = self.curr_driver_path - if capabilities is None: - capabilities = self.curr_caps - if options is None: - options = self.curr_options + self.__check_driver_ready__(driver_path, capabilities, options) return WebDriver.Firefox( executable_path=driver_path, capabilities=capabilities, @@ -293,10 +291,7 @@ def get_driver_iexplorer(self, driver_path=None, capabilities=None): Returns: [WebDriver.Ie] -- WebDriver opened and ready to be used """ - if driver_path is None: - driver_path = self.curr_driver_path - if capabilities is None: - capabilities = self.curr_caps + self.__check_driver_ready__(driver_path, capabilities) return WebDriver.Ie( executable_path=driver_path, capabilities=capabilities) @@ -314,38 +309,11 @@ def get_driver_edge(self, driver_path=None, capabilities=None): Returns: [WebDriver.Edge] -- WebDriver opened and ready to be used """ - if driver_path is None: - driver_path = self.curr_driver_path - if capabilities is None: - capabilities = self.curr_caps + self.__check_driver_ready__(driver_path, capabilities) return WebDriver.Edge( executable_path=driver_path, capabilities=capabilities) - def get_driver_opera(self, driver_path=None, capabilities=None, - options=None): - """Open WebDriver selenium based on Opera browser - - Keyword Arguments: - driver_path {str} -- Path for driver binary path - (default: {None}) - capabilities {DesiredCapabilities} -- Capabilities for browser - (default: {None}) - options {Options} -- Options for browser (default: {None}) - - Returns: - [WebDriver.Opera] -- WebDriver opened and ready to be used - """ - if driver_path is None: - driver_path = self.curr_driver_path - if capabilities is None: - capabilities = self.curr_caps - if options is None: - options = self.curr_options - return WebDriver.Opera( - executable_path=driver_path, - capabilities=capabilities) - def mode_local(self, browser_name='chrome'): """Open new brower on local mode @@ -366,7 +334,6 @@ def mode_local(self, browser_name='chrome'): "firefox": self.get_driver_firefox(), "iexplorer": self.get_driver_iexplorer(), "edge": self.get_driver_edge(), - "opera": self.get_driver_opera(), }[browser_name] except KeyError: raise CoreException( diff --git a/qacode/core/webs/controls/control_table.py b/qacode/core/webs/controls/control_table.py index 5ab32a01..35191eab 100644 --- a/qacode/core/webs/controls/control_table.py +++ b/qacode/core/webs/controls/control_table.py @@ -43,7 +43,10 @@ def __load_table__(self, element=None): """Allow to load all TR > TD items from a TABLE element Before structure some checks are necessary for some children elements: - caption {ControlBase}-- optional element + tbody {ControlBase}-- required 1 or more elements + caption {ControlBase}-- optional element if tbody found + thead {ControlBase}-- optional element if tbody found + tfoot {ControlBase}-- optional element if tbody found Examples: Use case 1. TABLE > (TR > TH)+(TR > TD) @@ -90,7 +93,9 @@ def __load_table_html5__(self): return rows def __get_row__(self, ctl_row, selector): - """WARNING: this method just can be used from __load_table__""" + """Allow to get cells of a element + WARNING: this method just can be used from __load_table__ + """ row = [] for cell in ctl_row.find_children(selector): text = cell.get_text() diff --git a/tests/001_functionals/suite_001_botbase.py b/tests/001_functionals/suite_001_botbase.py index 94ec2dbb..40e8121d 100644 --- a/tests/001_functionals/suite_001_botbase.py +++ b/tests/001_functionals/suite_001_botbase.py @@ -28,20 +28,47 @@ def setup_method(self, test_method): def teardown_method(self, method): """TODO: doc method""" + if method.__name__ == 'test_botbase_drivernamefilter_ok': + return True + self.try_bot_close() + + def try_bot_close(self): + """Utility method for tests""" try: if self.bot: self.bot.close() except Exception: - print( - "Fail at try to close bot, maybe never opened") + print("ERROR: Failed at try to close bot") + + @pytest.mark.skipIf(SKIP, SKIP_MSG) + @pytest.mark.parametrize("is_win", [True, False]) + @pytest.mark.parametrize("is_64bits", [True, False]) + @pytest.mark.parametrize("browser", ["chrome", "firefox"]) + def test_botbase_drivernamefilter_ok(self, browser, is_win, is_64bits): + """Testcase: test_botbase_drivernamefilter_ok""" + if 'bot' not in dir(self): + settings = SETTINGS.copy() + self.add_property('bot', BotBase(**settings)) + # end setup + self.bot.IS_WIN = is_win + self.bot.IS_64BITS = is_64bits + name_formatted = self.bot.driver_name_filter(browser) + if is_win and not is_64bits: + self.assert_equals( + name_formatted, "{}driver_32.exe".format(browser)) + if is_win and is_64bits: + self.assert_equals( + name_formatted, "{}driver_64.exe".format(browser)) + if not is_win and not is_64bits: + self.assert_equals( + name_formatted, "{}driver_32".format(browser)) + if not is_win and is_64bits: + self.assert_equals( + name_formatted, "{}driver_64".format(browser)) + self.try_bot_close() @pytest.mark.parametrize("browser_name", [ - "chrome", - "firefox", - "iexplorer", - "edge", - "opera" - ]) + "chrome", "firefox", "iexplorer", "edge"]) @pytest.mark.parametrize("driver_mode", ["local", "remote"]) def test_bot_modes_and_names(self, driver_mode, browser_name): """Testcase: test_001_bot_local_chrome""" @@ -57,12 +84,6 @@ def test_bot_modes_and_names(self, driver_mode, browser_name): pytest.skip(msg="Browser not configured") if browser_name == 'iexplorer': browser_name = 'internet explorer' - if browser_name == 'opera': - pytest.skip( - msg=("Issue opened on official opera" - " chromium github: " - "https://github.com/operasoftware" - "/operachromiumdriver/issues/9")) self.bot = BotBase(**settings) self.timer(wait=WAIT_TO_CLOSE) self.assert_is_instance(self.bot, BotBase) @@ -72,9 +93,7 @@ def test_bot_modes_and_names(self, driver_mode, browser_name): self.assert_equals(self.bot.settings.get('mode'), driver_mode) self.assert_equals(self.bot.curr_caps['browserName'], browser_name) - @pytest.mark.parametrize("browser_name", [ - "chrome", "firefox", "opera" - ]) + @pytest.mark.parametrize("browser_name", ["chrome", "firefox"]) @pytest.mark.parametrize("driver_mode", ["local", "remote"]) def test_bot_modes_headless(self, driver_mode, browser_name): """Testcase: test_bot_modes_headless""" @@ -86,12 +105,6 @@ def test_bot_modes_headless(self, driver_mode, browser_name): 'mode': str(driver_mode), 'options': {"headless": True} }) - if browser_name == 'opera': - pytest.skip( - msg=("Issue opened on official opera" - " chromium github: " - "https://github.com/operasoftware" - "/operachromiumdriver/issues/9")) self.bot = BotBase(**settings) self.timer(wait=WAIT_TO_CLOSE) self.assert_is_instance(self.bot, BotBase) @@ -101,6 +114,7 @@ def test_bot_modes_headless(self, driver_mode, browser_name): self.assert_equals(self.bot.settings.get('mode'), driver_mode) self.assert_equals(self.bot.curr_caps['browserName'], browser_name) + @pytest.mark.skipIf(SKIP, SKIP_MSG) def test_botbase_invalidsettingskey(self): """Testcase: test_botbase_invalidsettingskey""" settings = SETTINGS.copy() @@ -108,6 +122,7 @@ def test_botbase_invalidsettingskey(self): with pytest.raises(CoreException): BotBase(**settings) + @pytest.mark.skipIf(SKIP, SKIP_MSG) def test_botbase_invalidmode(self): """Testcase: test_botbase_invalidmode""" settings = SETTINGS.copy() @@ -115,6 +130,7 @@ def test_botbase_invalidmode(self): with pytest.raises(CoreException): self.bot = BotBase(**settings) + @pytest.mark.skipIf(SKIP, SKIP_MSG) def test_botbase_invalidbrowser(self): """Testcase: test_botbase_invalidbrowser""" settings = SETTINGS.copy() diff --git a/tests/002_benchmarks/suite_001_browsers.py b/tests/002_benchmarks/suite_001_browsers.py index f86bbe01..0d624f42 100644 --- a/tests/002_benchmarks/suite_001_browsers.py +++ b/tests/002_benchmarks/suite_001_browsers.py @@ -47,12 +47,6 @@ def bot_benchmark(self, browser_name, driver_mode, is_headless): pytest.skip(msg="Browser not configured") if browser_name == 'iexplorer': browser_name = 'internet explorer' - if browser_name == 'opera': - pytest.skip( - msg=("Issue opened on official opera" - " chromium github: " - "https://github.com/operasoftware" - "/operachromiumdriver/issues/9")) self.bot = BotBase(**settings) self.assert_is_instance(self.bot, BotBase) self.assert_equals( @@ -69,12 +63,7 @@ def bot_benchmark(self, browser_name, driver_mode, is_headless): @pytest.mark.benchmark(group='BROWSERS') @pytest.mark.parametrize("browser_name", [ - "chrome", - "firefox", - "iexplorer", - "edge", - "opera" - ]) + "chrome", "firefox", "iexplorer", "edge"]) @pytest.mark.parametrize("driver_mode", ["local", "remote"]) @pytest.mark.skipIf(SKIP, SKIP_MSG) def test_benchmark_browsers(self, benchmark, browser_name, driver_mode): @@ -93,9 +82,7 @@ def test_benchmark_browsers(self, benchmark, browser_name, driver_mode): rounds=ROUNDS) @pytest.mark.benchmark(group='BROWSERS_HEADLESS') - @pytest.mark.parametrize("browser_name", [ - "chrome", "firefox", "opera" - ]) + @pytest.mark.parametrize("browser_name", ["chrome", "firefox"]) @pytest.mark.parametrize("driver_mode", ["local", "remote"]) @pytest.mark.skipIf(SKIP, SKIP_MSG) def test_benchmark_browsers_headless(self, benchmark,