From cf6223039bb402b5f76cecc44ff32715096a095e Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Wed, 1 Nov 2023 16:48:22 -0300 Subject: [PATCH 01/25] change po_component po-input to class in CheckResult method. InputValue improvements. added index protection and find_parent filter by tabindex for multiples buttons. --- tir/technologies/poui_internal.py | 47 +++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/tir/technologies/poui_internal.py b/tir/technologies/poui_internal.py index b577c7303..bbe153eaf 100644 --- a/tir/technologies/poui_internal.py +++ b/tir/technologies/poui_internal.py @@ -1161,7 +1161,8 @@ def CheckResult(self, field, user_value, po_component, position): """ if po_component == 'po-input': - input_field = self.return_input_element(field, position) + po_component = "[class*='po-input']" + input_field = self.return_input_element(field, position, term=po_component) input_field_element = lambda: self.soup_to_selenium(input_field, twebview=True) if input_field_element(): current_value = self.get_web_value(input_field_element()) @@ -3104,20 +3105,34 @@ def InputValue(self, field, value, position): """ logger().info(f"Input Value in:'{field}'") - - input_field = self.return_input_element(field, position, term="[class*='po-input']") - self.switch_to_iframe() + success = False + + endtime = time.time() + self.config.time_out + while time.time() < endtime and not success: + + input_field = self.return_input_element(field, position, term="[class*='po-input']") - input_field_element = lambda: self.soup_to_selenium(input_field) + self.switch_to_iframe() + + input_field_element = lambda: self.soup_to_selenium(input_field) + + self.scroll_to_element(input_field_element()) + self.wait_until_to(expected_condition="element_to_be_clickable", element = input_field, locator = By.XPATH ) + self.set_element_focus(input_field_element()) + self.wait_until_to(expected_condition="element_to_be_clickable", element = input_field, locator = By.XPATH ) + self.click(input_field_element()) + input_field_element().clear() + input_field_element().send_keys(value) + + if self.driver.switch_to_active_element() == input_field_element(): + time.sleep(1) + ActionChains(self.driver).key_down(Keys.ENTER).perform() + time.sleep(1) + ActionChains(self.driver).key_down(Keys.TAB).perform() - self.scroll_to_element(input_field_element()) - self.wait_until_to(expected_condition="element_to_be_clickable", element = input_field, locator = By.XPATH ) - self.set_element_focus(input_field_element()) - self.wait_until_to(expected_condition="element_to_be_clickable", element = input_field, locator = By.XPATH ) - self.click(input_field_element()) - input_field_element().clear() - input_field_element().send_keys(value) + time.sleep(2) + success = self.get_web_value(input_field_element()).strip() != '' def return_input_element(self, field=None, position=1, term=None): """ @@ -3166,15 +3181,17 @@ def return_main_element(self, field, position, selector, container): else: po_component_span = list(filter(lambda x: field.lower() in x.text.lower(), po_component)) if len(po_component_span) > 1: - po_component_span = list(filter(lambda x: self.return_index_element(x), po_component_span)) + has_index = list(filter(lambda x: self.return_index_element(x), po_component_span)) + if has_index: + po_component_span = has_index if len(po_component_span) >= position: po_component_span = po_component_span[position] return next(iter(po_component_span.find_parent('po-field-container')), None) if container else po_component_span def return_index_element(self, element): - if hasattr(element.find_parent('div', class_='po-modal-content'), 'attrs'): - return element if element.find_parent('div', class_='po-modal-content').attrs['tabindex'] == '-1' else None + if hasattr(element.find_parent('div', {'tabindex': '-1'}), 'attr'): + return element if element.find_parent('div', {'tabindex': '-1'}) else None def po_loading(self, selector): """ From 03d395af05929cb83b6af8d54029d1b54b9a7073 Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Fri, 3 Nov 2023 15:28:08 -0300 Subject: [PATCH 02/25] branch release v1.20.16rc1 --- scripts/install_package.cmd | 2 +- tir/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index 7248d1ff5..3e1735d66 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.15.tar.gz +pip install -U dist/tir_framework-1.20.16rc1.tar.gz pause >nul | set/p = Press any key to exit ... diff --git a/tir/version.py b/tir/version.py index 1930f8f3a..3fa0c2f59 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.15' +__version__ = '1.20.16rc1' From 115dd80e6a9aa0f13ced25b877c30f5400c11f2b Mon Sep 17 00:00:00 2001 From: LEANDRO L MONTEIRO <60761500+98llm@users.noreply.github.com> Date: Mon, 27 Nov 2023 11:10:33 -0300 Subject: [PATCH 03/25] Update version.py --- tir/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tir/version.py b/tir/version.py index 3fa0c2f59..1e0ec2e7b 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.16rc1' +__version__ = '1.20.16rc2' From 1108fc9584e0051d550afb65fd0a0f3c7a06049f Mon Sep 17 00:00:00 2001 From: LEANDRO L MONTEIRO <60761500+98llm@users.noreply.github.com> Date: Mon, 27 Nov 2023 11:10:50 -0300 Subject: [PATCH 04/25] Update install_package.cmd --- scripts/install_package.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index 3e1735d66..5bd2e742e 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.16rc1.tar.gz +pip install -U dist/tir_framework-1.20.16rc2.tar.gz pause >nul | set/p = Press any key to exit ... From 48c35462f156b80f81d0eb6dff3ed3fa9edab544 Mon Sep 17 00:00:00 2001 From: 98llm Date: Mon, 27 Nov 2023 11:55:15 -0300 Subject: [PATCH 05/25] hotfix/clickFolder --- tir/technologies/webapp_internal.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index 8d9c96943..90749b5ba 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -3555,6 +3555,9 @@ def selenium_web_scrap(self, term, container, optional_term, second_term=None): labels_not_none = list(filter(lambda x: x is not None and x, labels)) if len(labels_not_none) > 0: labels_displayed = list(filter(lambda x: x.is_displayed(), labels_not_none)) + if '.dict-tfolder' in optional_term: + if container.select('.dict-tfolder') and self.search_navigation_bar(container.select('.dict-tfolder')): + labels_displayed = labels_not_none if labels_displayed: element = next(iter(list(filter(lambda x: term.lower() in x.text.lower().replace('\n', ''), labels_displayed))), None) @@ -3574,6 +3577,27 @@ def selenium_web_scrap(self, term, container, optional_term, second_term=None): except: return None + + def search_navigation_bar(self, container): + """ + [Internal] + Searches for navigation buttons into bs4 object. + + :return: selenium object or None + :rtype: navigation selenium object + + Usage: + >>> # Calling the method: + >>> self.search_navigation_bar(container) + """ + if container and isinstance(container, list): + container = next(iter(container), None) + container = self.soup_to_selenium(container) + if container: + tab_bar = self.driver.execute_script(f"return arguments[0].shadowRoot.querySelector('wa-tab-bar').shadowRoot.querySelector('.navigation')", container) + return tab_bar + + def search_for_errors(self, check_help=True): """ [Internal] From 9277fbed8590f2e7c1bdd408dc779dab8524240d Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Tue, 28 Nov 2023 17:26:40 -0300 Subject: [PATCH 06/25] remove close process and add win32 condition in service_process_bat_file() method. --- tir/technologies/webapp_internal.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index 90749b5ba..faba04ae9 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -30,6 +30,7 @@ from datetime import datetime from tir.technologies.core.logging_config import logger import pathlib +import sys class WebappInternal(Base): """ @@ -361,8 +362,9 @@ def service_process_bat_file(self): This method creates a batfile in the root path to kill the process and its children. """ if self.config.smart_test: - with open("firefox_task_kill.bat", "w", ) as firefox_task_kill: - firefox_task_kill.write(f"taskkill /f /PID {self.driver.service.process.pid} /T") + if sys.platform == 'win32': + with open("firefox_task_kill.bat", "w", ) as firefox_task_kill: + firefox_task_kill.write(f"taskkill /f /PID {self.driver.service.process.pid} /T") def program_screen(self, initial_program="", environment="", coverage=False, poui=False): """ @@ -10445,7 +10447,7 @@ def restart_browser(self): logger().info("Closing the Browser") self.driver.close() - self.close_process() + # self.close_process() logger().info("Starting the Browser") self.Start() From 239119fe396b73921a0dbc7f3212281a0f0831d0 Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Tue, 28 Nov 2023 17:40:08 -0300 Subject: [PATCH 07/25] branch release v1.20.16rc3 --- scripts/install_package.cmd | 2 +- tir/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index 5bd2e742e..8caa3d5fd 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.16rc2.tar.gz +pip install -U dist/tir_framework-1.20.16rc3.tar.gz pause >nul | set/p = Press any key to exit ... diff --git a/tir/version.py b/tir/version.py index 1e0ec2e7b..39a7f8369 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.16rc2' +__version__ = '1.20.16rc3' From 073927c3019ba013ea1535f1ef12e27cc0c6ffc8 Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Fri, 1 Dec 2023 14:49:39 -0300 Subject: [PATCH 08/25] Added Webdriverwait in get_url with some trying. --- tir/technologies/core/base.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tir/technologies/core/base.py b/tir/technologies/core/base.py index 8778d78c8..38f822612 100644 --- a/tir/technologies/core/base.py +++ b/tir/technologies/core/base.py @@ -1170,15 +1170,17 @@ def get_url(self, url=None): url = self.config.url if not url else url - endtime = time.time() + self.config.time_out - while (time.time() < endtime and not get_url): - - logger().debug('Get URL') + num_of_trying = 1 + while not get_url and num_of_trying <= 5: + self.driver.get(url) try: - self.driver.get(url) + WebDriverWait(self.driver, int(self.config.time_out / num_of_trying)).until(EC.presence_of_element_located((By.ID, 'fieldsetStartProg'))) + logger().info("Page is ready!") get_url = True + break except: - get_url = False + num_of_trying += 1 + logger().info(f"Loading took too much time! num_of_trying: {str(num_of_trying)}") def TearDown(self): """ From 2710915e173f8659c8c1ae3bec559d935ac57d46 Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Fri, 1 Dec 2023 14:57:29 -0300 Subject: [PATCH 09/25] branch release v1.20.16rc4 --- scripts/install_package.cmd | 2 +- tir/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index 8caa3d5fd..fc79b80de 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.16rc3.tar.gz +pip install -U dist/tir_framework-1.20.16rc4.tar.gz pause >nul | set/p = Press any key to exit ... diff --git a/tir/version.py b/tir/version.py index 39a7f8369..0e83f1110 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.16rc3' +__version__ = '1.20.16rc4' From e8297e43380c5b09c1fa22913421b11720684d0f Mon Sep 17 00:00:00 2001 From: 98llm Date: Fri, 1 Dec 2023 15:24:46 -0300 Subject: [PATCH 10/25] hotfix/grid modals process --- tir/technologies/webapp_internal.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index faba04ae9..20e9d6a32 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -6246,8 +6246,10 @@ def fill_grid(self, field, x3_dictionaries, initial_layer, duplicate_fields=[]): else: try_counter = 0 + modal_open = self.wait_element_timeout(term='wa-dialog', scrap_type=enum.ScrapType.CSS_SELECTOR, position= tmodal_layer + 1, timeout=10, presence=True, main_container='body', check_error=False) + if (("_" in field[0] and field_to_len != {} and int(field_to_len[field[0]]) > len( - field[1])) or lenfield > len(field[1])): + field[1])) or lenfield > len(field[1])) and modal_open: if (("_" in field[0] and field_to_valtype != {} and field_to_valtype[ field[0]] != "N") or valtype != "N"): self.send_keys(selenium_input(), Keys.ENTER) From 96b484fa3fbeeb53014d9c085abd96c86f2b9394 Mon Sep 17 00:00:00 2001 From: renanllisboa Date: Fri, 1 Dec 2023 16:41:05 -0300 Subject: [PATCH 11/25] added user advpr.sp for root and smart_test --- tir/technologies/core/base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tir/technologies/core/base.py b/tir/technologies/core/base.py index 38f822612..203729f62 100644 --- a/tir/technologies/core/base.py +++ b/tir/technologies/core/base.py @@ -103,6 +103,10 @@ def __init__(self, config_path="", autostart=True): import getpass self.log.user = getpass.getuser() + if self.config.smart_test: + if self.log.user == 'root': + self.log.user = 'advpr.sp' + self.base_container = "body" self.config.log_file = False self.tmenu_out_iframe = False From 94146f9ef793bd87127b692c3bb3069ffdbf2236 Mon Sep 17 00:00:00 2001 From: kdisso Date: Fri, 24 Nov 2023 12:53:18 +0300 Subject: [PATCH 12/25] fix language pack (cherry picked from commit 7cd3af89c2035443dd42641b991dd7389a0ead7a) --- tir/technologies/core/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tir/technologies/core/language.py b/tir/technologies/core/language.py index 243f0e644..a167817be 100644 --- a/tir/technologies/core/language.py +++ b/tir/technologies/core/language.py @@ -353,7 +353,7 @@ def get_language_pack(self, language): russian = { "User": "Пользователь", "Password": "Пароль", - "Database": "Дата", + "Database": "Базовая дата", "Group": "Группа", "Branch": "Филиал", "Environment": "Среда", From 19f22ba386e03a1029534f1efda9633654ec45c3 Mon Sep 17 00:00:00 2001 From: 98llm Date: Tue, 5 Dec 2023 17:06:44 -0300 Subject: [PATCH 13/25] release/1.20.16rc5 --- scripts/install_package.cmd | 2 +- tir/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index fc79b80de..9e1b56a84 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.16rc4.tar.gz +pip install -U dist/tir_framework-1.20.16rc5.tar.gz pause >nul | set/p = Press any key to exit ... diff --git a/tir/version.py b/tir/version.py index 0e83f1110..98fe2fed3 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.16rc4' +__version__ = '1.20.16rc5' From a5dae2fe4cdc65ede317217ffddc1a0667c95748 Mon Sep 17 00:00:00 2001 From: 98llm Date: Wed, 6 Dec 2023 08:55:23 -0300 Subject: [PATCH 14/25] feature/widown_size --- tir/technologies/core/base.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tir/technologies/core/base.py b/tir/technologies/core/base.py index 203729f62..a6f95937e 100644 --- a/tir/technologies/core/base.py +++ b/tir/technologies/core/base.py @@ -1160,6 +1160,11 @@ def Start(self): self.get_url() + if self.driver: + window_size = self.driver.get_window_size() + logger().info(f"Browser maximized to {window_size['width']}x{window_size['height']}") + if window_size and not 768 in range(window_size['height'], window_size['height']+ 40): + logger().info(f"Screen size is different from default used in headless mode") self.wait = WebDriverWait(self.driver, self.config.time_out) if not self.config.poui: From 94abd40c475751fbd7fc87836c0ae85480c1a28a Mon Sep 17 00:00:00 2001 From: Helena Adrignoli Leal Date: Mon, 11 Dec 2023 07:02:00 -0300 Subject: [PATCH 15/25] release/v.1.20.16rc6 --- scripts/install_package.cmd | 2 +- tir/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index 9e1b56a84..cac4d206f 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.16rc5.tar.gz +pip install -U dist/tir_framework-1.20.16rc6.tar.gz pause >nul | set/p = Press any key to exit ... diff --git a/tir/version.py b/tir/version.py index 98fe2fed3..e415e89e2 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.16rc5' +__version__ = '1.20.16rc6' From b3455eb3f08e9cbf75b9dfd150f29bf128e7bd40 Mon Sep 17 00:00:00 2001 From: Helena Adrignoli Leal Date: Mon, 11 Dec 2023 08:03:47 -0300 Subject: [PATCH 16/25] feature/procedure_menu --- tir/main.py | 24 +++++ tir/technologies/core/config.py | 1 + tir/technologies/core/language.py | 37 ++++++-- tir/technologies/webapp_internal.py | 137 ++++++++++++++++++++++++++++ 4 files changed, 193 insertions(+), 6 deletions(-) diff --git a/tir/main.py b/tir/main.py index c422b98fa..cb203cc30 100644 --- a/tir/main.py +++ b/tir/main.py @@ -1410,6 +1410,30 @@ def ClickByLocator(self, selector='', locator='', right_click=False): :return: None """ return self.__webapp.click_by_locator(selector, locator, right_click, shadow_root=True) + + def AddProcedure(self, procedure, group): + """ + Install/Desinstall a procedure in CFG to be set by SetProcedures method. + + Usage: + + >>> # Calling the method: + >>> oHelper.AddProcedure("01", "T1") + """ + return self.__webapp.AddProcedure(procedure, group) + + def SetProcedures(self, is_procedure_install=True): + """ + Sets the procedures in CFG screen. The procedures must be passed with calls for **AddProcedure** method. + + Usage: + + >>> # Adding procedures: + >>> oHelper.AddProcedure("19", "T1") + >>> # Calling the method: + >>> oHelper.SetProcedures() + """ + return self.__webapp.SetProcedures(is_procedure_install) class Apw(): diff --git a/tir/technologies/core/config.py b/tir/technologies/core/config.py index 63b470572..0f6ce757a 100644 --- a/tir/technologies/core/config.py +++ b/tir/technologies/core/config.py @@ -87,3 +87,4 @@ def __init__(self, path="config.json"): self.ssl_chrome_auto_install_disable = ( "SSLChromeInstallDisable" in data and bool(data["SSLChromeInstallDisable"])) self.data_delimiter = str(data["DataDelimiter"]) if "DataDelimiter" in data else "/" + self.procedure_menu = str(data["ProcedureMenu"]) if "ProcedureMenu" in data else "" diff --git a/tir/technologies/core/language.py b/tir/technologies/core/language.py index 243f0e644..b3320cc74 100644 --- a/tir/technologies/core/language.py +++ b/tir/technologies/core/language.py @@ -82,8 +82,12 @@ def __init__(self, language="pt-BR"): self.ref_dt = languagepack["Ref.Dt"] self.time = languagepack["Time"] self.end_time = languagepack["End Time"] - - + self.procedure_menu = languagepack["Procedure Menu"] + self.code = languagepack["Code"] + self.success = languagepack["Success"] + self.procedure_install = languagepack["Procedure Install"] + self.procedure_uninstall = languagepack["Procedure Uninstall"] + self.messages = Messages(languagepack) def get_language_pack(self, language): @@ -173,7 +177,13 @@ def get_language_pack(self, language): "Issued": "Issued", "Ref.Dt": "Ref.Dt", "Time": "Time", - "End Time": "End Time" + "End Time": "End Time", + "Procedure Menu": "Procedure Menu", + "Code": "Code", + "Success": "Success", + "Procedure Install": "Install selected processes", + "Procedure Uninstall": "Remove selected processes" + } brazilian_portuguese = { @@ -261,7 +271,12 @@ def get_language_pack(self, language): "Issued": "Emissão", "Ref.Dt": "DT.Ref.", "Time": "Hora", - "End Time": "Hora Término" + "End Time": "Hora Término", + "Procedure Menu": "Procedure Menu", + "Code": "Código", + "Success": "Sucessos", + "Procedure Install": "Instalar processos selecionados", + "Procedure Uninstall": "Remover processos selecionados" } spanish = { "User": "Usuário", @@ -348,7 +363,12 @@ def get_language_pack(self, language): "Issued": "Emision", "Ref.Dt": "Fc.Ref.", "Time": "Hora", - "End Time": "Hora Término" + "End Time": "Hora Término", + "Procedure Menu": "Procedure Menu", + "Code": "Código", + "Success": "Sucessos", + "Procedure Install": "Instalar processos selecionados", + "Procedure Uninstall": "Remover processos selecionados" } russian = { "User": "Пользователь", @@ -437,7 +457,12 @@ def get_language_pack(self, language): "Issued": "Issued", "Ref.Dt": "Ref.Dt", "Time": "Time", - "End Time": "End Time" + "End Time": "End Time", + "Procedure Menu": "Меню процедур", + "Code": "Код", + "Success": "успех", + "Procedure Install": "Установить выбранные процессы", + "Procedure Uninstall": "Удалить выбранные процессы" } if language.lower() == "en-us": diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index 20e9d6a32..402a73505 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -98,6 +98,7 @@ def __init__(self, config_path="", autostart=True): self.blocker = None self.parameters = [] + self.procedures = [] self.backup_parameters = [] self.tree_base_element = () self.tmenu_screen = None @@ -10478,3 +10479,139 @@ def close_process(self): os.system("taskkill /f /im geckodriver.exe") except Exception as e: logger().debug(f'Close process error: {str(e)}') + + def AddProcedure(self, procedure, group): + """ + Install/Desinstall a procedure in CFG to be set by SetProcedures method. + + Usage: + + >>> # Calling the method: + >>> oHelper.AddProcedure("01", "T1") + """ + + logger().info(f"AddProcedure: {procedure}") + + endtime = time.time() + self.config.time_out + halftime = ((endtime - time.time()) / 2) + + self.procedures.append([procedure.strip(), group]) + + + def SetProcedures(self, is_procedure_install=True): + """ + Sets the procedures in CFG screen. The procedures must be passed with calls for **AddProcedure** method. + + Usage: + + >>> # Adding procedures: + >>> oHelper.AddProcedure("19", "T1") + >>> # Calling the method: + >>> oHelper.SetProcedures() + """ + + self.procedure_screen(is_procedure_install) + + def procedure_screen(self, is_procedure_install): + """ + [Internal] + + Internal method of SetProcedures. + + :type restore_backup: bool + + Usage: + + >>> # Calling the method: + >>> self.parameter_screen(restore_backup=False) + """ + procedure_codes = [] + procedure_groups = [] + exception = None + stack = None + success = False + + procedure_install = self.language.procedure_install + procedure_uninstall = self.language.procedure_uninstall + + self.tmenu_screen = self.check_tmenu_screen() + + try: + self.driver_refresh() + except Exception as error: + exception = error + + if not exception: + if self.config.browser.lower() == "chrome": + try: + self.wait_until_to( expected_condition = "alert_is_present" ) + self.driver.switch_to_alert().accept() + except: + pass + + self.Setup("SIGACFG", self.config.date, self.config.group, self.config.branch, save_input=False) + self.SetLateralMenu(self.config.procedure_menu if self.config.procedure_menu else self.language.procedure_menu, save_input=False) + + self.wait_element(term=".ttoolbar, wa-toolbar, wa-panel, wa-tgrid", scrap_type=enum.ScrapType.CSS_SELECTOR) + + endtime = time.time() + self.config.time_out + + while(time.time() < endtime and not success): + + for procedure in self.procedures: + container = self.get_current_container() + procedure_codes.append(procedure[0]) + procedure_groups.append(procedure[1]) + + procedure_codes = list(set(procedure_codes)) + procedure_groups = list(set(procedure_groups)) + + for group in procedure_groups: + self.ClickBox(self.language.code, group) + time.sleep(2) + ActionChains(self.driver).key_down(Keys.HOME).perform() + + for code in procedure_codes: + self.ClickBox(self.language.code, code, grid_number=2) + time.sleep(2) + ActionChains(self.driver).key_down(Keys.HOME).perform() + + procedure_buttons = container.select('wa-button') + + if is_procedure_install: + procedure_install_button = list(filter(lambda x: x.get("title") == procedure_install, procedure_buttons))[0] + self.click(self.soup_to_selenium(procedure_install_button)) + else: + procedure_uninstall_button = list(filter(lambda x: x.get("title") == procedure_uninstall, procedure_buttons))[0] + self.click(self.soup_to_selenium(procedure_uninstall_button)) + + self.SetButton(self.language.yes) + + container = self.get_current_container() + procedure_success = list(filter(lambda x: self.language.success in x.get("caption"), container.select("wa-text-view"))) + if procedure_success: + number_proc_success = procedure_success[0].get("caption").split(":")[1].strip() + if int(number_proc_success) == len(procedure_codes): + success = True + self.SetButton(self.language.close) + + self.procedures = [] + time.sleep(1) + + if self.config.coverage: + self.driver_refresh() + else: + self.Finish() + + self.Setup(self.config.initial_program, self.config.date, self.config.group, self.config.branch, save_input=not self.config.autostart) + + if not self.tmenu_screen: + if ">" in self.config.routine: + self.SetLateralMenu(self.config.routine, save_input=False) + else: + self.Program(self.config.routine) + else: + stack = next(iter(list(map(lambda x: x.function, filter(lambda x: re.search('tearDownClass', x.function), inspect.stack())))), None) + if(stack and not stack.lower() == "teardownclass"): + self.restart_counter += 1 + self.log_error(f"Wasn't possible execute parameter_screen() method Exception: {exception}") \ No newline at end of file From 215c70d6ce6c0a30878bac89549deb3da560603e Mon Sep 17 00:00:00 2001 From: Helena Adrignoli Leal Date: Mon, 11 Dec 2023 08:25:38 -0300 Subject: [PATCH 17/25] feature/procedure_menu --- tir/technologies/core/language.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tir/technologies/core/language.py b/tir/technologies/core/language.py index b3320cc74..40f954aed 100644 --- a/tir/technologies/core/language.py +++ b/tir/technologies/core/language.py @@ -178,7 +178,7 @@ def get_language_pack(self, language): "Ref.Dt": "Ref.Dt", "Time": "Time", "End Time": "End Time", - "Procedure Menu": "Procedure Menu", + "Procedure Menu": "Base de Dados > Dicionário > Stored Procedure", "Code": "Code", "Success": "Success", "Procedure Install": "Install selected processes", @@ -272,7 +272,7 @@ def get_language_pack(self, language): "Ref.Dt": "DT.Ref.", "Time": "Hora", "End Time": "Hora Término", - "Procedure Menu": "Procedure Menu", + "Procedure Menu": "Base de Dados > Dicionário > Stored Procedure", "Code": "Código", "Success": "Sucessos", "Procedure Install": "Instalar processos selecionados", @@ -364,7 +364,7 @@ def get_language_pack(self, language): "Ref.Dt": "Fc.Ref.", "Time": "Hora", "End Time": "Hora Término", - "Procedure Menu": "Procedure Menu", + "Procedure Menu": "Base de Dados > Dicionário > Stored Procedure", "Code": "Código", "Success": "Sucessos", "Procedure Install": "Instalar processos selecionados", @@ -458,7 +458,7 @@ def get_language_pack(self, language): "Ref.Dt": "Ref.Dt", "Time": "Time", "End Time": "End Time", - "Procedure Menu": "Меню процедур", + "Procedure Menu": "Base de Dados > Dicionário > Stored Procedure", "Code": "Код", "Success": "успех", "Procedure Install": "Установить выбранные процессы", From 5554ac077a1b1528f580e23fbf5786cee600877d Mon Sep 17 00:00:00 2001 From: Helena Adrignoli Leal Date: Mon, 11 Dec 2023 08:27:39 -0300 Subject: [PATCH 18/25] feature/procedure_menu --- tir/technologies/core/language.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tir/technologies/core/language.py b/tir/technologies/core/language.py index 40f954aed..e530780e1 100644 --- a/tir/technologies/core/language.py +++ b/tir/technologies/core/language.py @@ -178,7 +178,7 @@ def get_language_pack(self, language): "Ref.Dt": "Ref.Dt", "Time": "Time", "End Time": "End Time", - "Procedure Menu": "Base de Dados > Dicionário > Stored Procedure", + "Procedure Menu": "Database > Dictionary > Stored Procedure", "Code": "Code", "Success": "Success", "Procedure Install": "Install selected processes", @@ -458,7 +458,7 @@ def get_language_pack(self, language): "Ref.Dt": "Ref.Dt", "Time": "Time", "End Time": "End Time", - "Procedure Menu": "Base de Dados > Dicionário > Stored Procedure", + "Procedure Menu": "Database > Dictionary > Stored Procedure", "Code": "Код", "Success": "успех", "Procedure Install": "Установить выбранные процессы", From 5ab3f75dedb67c60b0c9167f1cabacaecb7e88e9 Mon Sep 17 00:00:00 2001 From: Helena Adrignoli Leal Date: Thu, 14 Dec 2023 13:43:27 -0300 Subject: [PATCH 19/25] feature/procedure_menu --- tir/main.py | 12 ++++++++++-- tir/technologies/webapp_internal.py | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/tir/main.py b/tir/main.py index cb203cc30..0cdc01dcb 100644 --- a/tir/main.py +++ b/tir/main.py @@ -1415,6 +1415,11 @@ def AddProcedure(self, procedure, group): """ Install/Desinstall a procedure in CFG to be set by SetProcedures method. + :param procedure: The procedure to be clicked in edit screen. + :type branch: str + :param group: The group name. + :type parameter: str + Usage: >>> # Calling the method: @@ -1423,15 +1428,18 @@ def AddProcedure(self, procedure, group): return self.__webapp.AddProcedure(procedure, group) def SetProcedures(self, is_procedure_install=True): - """ + """ Sets the procedures in CFG screen. The procedures must be passed with calls for **AddProcedure** method. Usage: + :param is_procedure_install: If True will install the procedure. + :type branch: str + >>> # Adding procedures: >>> oHelper.AddProcedure("19", "T1") >>> # Calling the method: - >>> oHelper.SetProcedures() + >>> oHelper.SetProcedures(is_procedure_install=True) """ return self.__webapp.SetProcedures(is_procedure_install) diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index 402a73505..683933f73 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -10484,6 +10484,11 @@ def AddProcedure(self, procedure, group): """ Install/Desinstall a procedure in CFG to be set by SetProcedures method. + :param procedure: The procedure to be clicked in edit screen. + :type branch: str + :param group: The group name. + :type parameter: str + Usage: >>> # Calling the method: @@ -10504,10 +10509,13 @@ def SetProcedures(self, is_procedure_install=True): Usage: + :param is_procedure_install: If True will install the procedure. + :type branch: str + >>> # Adding procedures: >>> oHelper.AddProcedure("19", "T1") >>> # Calling the method: - >>> oHelper.SetProcedures() + >>> oHelper.SetProcedures(is_procedure_install=True) """ self.procedure_screen(is_procedure_install) From f8801bf403481dfaa367473b5e58af3119d376dd Mon Sep 17 00:00:00 2001 From: Helena Adrignoli Leal Date: Thu, 14 Dec 2023 13:44:33 -0300 Subject: [PATCH 20/25] feature/procedure_menu --- tir/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tir/main.py b/tir/main.py index 0cdc01dcb..0ed3bd1d7 100644 --- a/tir/main.py +++ b/tir/main.py @@ -1428,7 +1428,7 @@ def AddProcedure(self, procedure, group): return self.__webapp.AddProcedure(procedure, group) def SetProcedures(self, is_procedure_install=True): - """ + """ Sets the procedures in CFG screen. The procedures must be passed with calls for **AddProcedure** method. Usage: From b805da8b19c8871ebbfab3014beaa389471e2e43 Mon Sep 17 00:00:00 2001 From: 98llm Date: Thu, 14 Dec 2023 13:51:56 -0300 Subject: [PATCH 21/25] feature/GetLineNumber --- tir/main.py | 12 +++++ tir/technologies/webapp_internal.py | 72 +++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/tir/main.py b/tir/main.py index c422b98fa..07811df69 100644 --- a/tir/main.py +++ b/tir/main.py @@ -1411,6 +1411,18 @@ def ClickByLocator(self, selector='', locator='', right_click=False): """ return self.__webapp.click_by_locator(selector, locator, right_click, shadow_root=True) + + def GetLineNumber(self, values, columns=[], grid_number=0): + """ + + :param values: values composition expected in respective columns + :param columns: reference columns used to get line + :param grid_number: + :return: + """ + return self.__webapp.GetLineNumber(values,columns, grid_number) + + class Apw(): def __init__(self, config_path=""): diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index 20e9d6a32..34f2cb822 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -10478,3 +10478,75 @@ def close_process(self): os.system("taskkill /f /im geckodriver.exe") except Exception as e: logger().debug(f'Close process error: {str(e)}') + + + def GetLineNumber(self, values=[], columns=[], grid_number=0): + """ + + :param values: reference columns used to get line + :param columns: values composition expected in respective columns + :param grid_number: + :return: + """ + + grid_number = grid_number-1 if grid_number > 0 else 0 + + self.wait_blocker() + + if columns and len(columns) != len(values): + self.log_error('Number of Values divergent from columns!') + return + + success = False + endtime = time.time() + self.config.time_out + while(time.time() < endtime): + + containers = self.web_scrap(term=".tmodaldialog, wa-dialog", scrap_type=enum.ScrapType.CSS_SELECTOR, main_container="body") + container = next(iter(self.zindex_sort(containers, True)), None) + + if container: + grid_term = self.grid_selectors['new_web_app'] + + grids = container.select(grid_term) + + if grids: + grids = self.filter_active_tabs(grids) + grids = self.filter_displayed_elements(grids) + + if grids: + headers = self.get_headers_from_grids(grids) + values = list(map(lambda x: x.lower().strip() , values)) + columns_numbers = [] + + if columns: + columns = list(map(lambda x: x.lower().strip(), columns)) + difference = list(filter(lambda x: x not in list(headers[grid_number].keys()), columns)) + columns_numbers = list(map(lambda x: headers[grid_number][x], columns)) + + if difference: + self.log_error(f"There's no have {difference} in the grid") + return + + if grid_number > len(grids): + self.log_error(self.language.messages.grid_number_error) + + grid = self.soup_to_selenium(grids[grid_number]) + rows = self.find_shadow_element('tbody tr', grid) + + if rows: + for row in rows: + row_columns = self.driver.execute_script("return arguments[0].querySelectorAll('td')", row ) + + if len(row_columns) < len(columns) or not row_columns: + self.log_error(f"There are not number of columns present in the grid") + return + + filtered_columns = [row_columns[x] for x in columns_numbers] if columns_numbers else row_columns + if filtered_columns: + if columns: + filtered_cells = list(filter(lambda x: x[1].text.lower().strip() == values[x[0]], enumerate(filtered_columns))) + else: + filtered_cells = list(filter(lambda x: x[1].text.lower().strip() in values, enumerate(filtered_columns))) + if len(filtered_cells) == len(values): + return rows.index(row) + From 4b843e02072de0841e3fc7a82b9b69ac2bc1cda9 Mon Sep 17 00:00:00 2001 From: 98llm Date: Thu, 14 Dec 2023 13:52:41 -0300 Subject: [PATCH 22/25] hotfix docs --- tir/technologies/webapp_internal.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index 34f2cb822..37a65e714 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -10483,12 +10483,12 @@ def close_process(self): def GetLineNumber(self, values=[], columns=[], grid_number=0): """ - :param values: reference columns used to get line - :param columns: values composition expected in respective columns + :param values: values composition expected in respective columns + :param columns: reference columns used to get line :param grid_number: :return: """ - + grid_number = grid_number-1 if grid_number > 0 else 0 self.wait_blocker() From 7895f8ec433f7f61fc34900cae592a50d17404e0 Mon Sep 17 00:00:00 2001 From: LEANDRO L MONTEIRO <60761500+98llm@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:17:52 -0300 Subject: [PATCH 23/25] Update webapp_internal.py --- tir/technologies/webapp_internal.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tir/technologies/webapp_internal.py b/tir/technologies/webapp_internal.py index e688a5875..7e418cadf 100644 --- a/tir/technologies/webapp_internal.py +++ b/tir/technologies/webapp_internal.py @@ -10592,7 +10592,6 @@ def SetProcedures(self, is_procedure_install=True): self.procedure_screen(is_procedure_install) - def procedure_screen(self, is_procedure_install): """ [Internal] From 8a01d8aaa6c9b479985d32e1eaa930026e41e9be Mon Sep 17 00:00:00 2001 From: LEANDRO L MONTEIRO <60761500+98llm@users.noreply.github.com> Date: Fri, 29 Dec 2023 15:05:28 -0300 Subject: [PATCH 24/25] release/v1.20.16 --- tir/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tir/version.py b/tir/version.py index e415e89e2..cd34e704c 100644 --- a/tir/version.py +++ b/tir/version.py @@ -1 +1 @@ -__version__ = '1.20.16rc6' +__version__ = '1.20.16' From 280ec054601ecc65e220036dbacd1ab6660f8961 Mon Sep 17 00:00:00 2001 From: LEANDRO L MONTEIRO <60761500+98llm@users.noreply.github.com> Date: Fri, 29 Dec 2023 15:05:45 -0300 Subject: [PATCH 25/25] Update install_package.cmd --- scripts/install_package.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install_package.cmd b/scripts/install_package.cmd index cac4d206f..344cc5840 100644 --- a/scripts/install_package.cmd +++ b/scripts/install_package.cmd @@ -13,5 +13,5 @@ taskkill /f /im chromedriver.exe echo ------------------------- echo Installing project... echo ------------------------- -pip install -U dist/tir_framework-1.20.16rc6.tar.gz +pip install -U dist/tir_framework-1.20.16.tar.gz pause >nul | set/p = Press any key to exit ...