csc-cia-stne 0.1.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/PKG-INFO +1 -1
  2. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/pyproject.toml +1 -1
  3. csc_cia_stne-0.1.1/src/csc_cia_stne/utilitarios/web_screen/__init__.py +2 -0
  4. csc_cia_stne-0.1.1/src/csc_cia_stne/utilitarios/web_screen/web_screen_abstract.py +84 -0
  5. csc_cia_stne-0.1.1/src/csc_cia_stne/utilitarios/web_screen/web_screen_botcity.py +285 -0
  6. csc_cia_stne-0.1.1/src/csc_cia_stne/utilitarios/web_screen/web_screen_selenium.py +350 -0
  7. csc_cia_stne-0.1.1/src/csc_cia_stne/web.py +71 -0
  8. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne.egg-info/PKG-INFO +1 -1
  9. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne.egg-info/SOURCES.txt +5 -1
  10. csc_cia_stne-0.1.0/src/csc_cia_stne/web.py +0 -513
  11. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/LICENCE +0 -0
  12. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/README.md +0 -0
  13. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/README_PYPI.md +0 -0
  14. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/setup.cfg +0 -0
  15. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/__init__.py +0 -0
  16. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/bc_correios.py +0 -0
  17. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/bc_sta.py +0 -0
  18. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/email.py +0 -0
  19. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/ftp.py +0 -0
  20. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/gcp_bigquery.py +0 -0
  21. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/gcp_bucket.py +0 -0
  22. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/google_drive.py +0 -0
  23. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/karavela.py +0 -0
  24. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/logger_json.py +0 -0
  25. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/logger_rich.py +0 -0
  26. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/provio.py +0 -0
  27. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/servicenow.py +0 -0
  28. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/slack.py +0 -0
  29. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/stne_admin.py +0 -0
  30. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/__init__.py +0 -0
  31. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/__init__.py +0 -0
  32. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_b64.py +0 -0
  33. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_converters.py +0 -0
  34. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_datetime.py +0 -0
  35. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_get_secret.py +0 -0
  36. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +0 -0
  37. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_settings.py +0 -0
  38. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/functions/func_titulo.py +0 -0
  39. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +0 -0
  40. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +0 -0
  41. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +0 -0
  42. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/__init__.py +0 -0
  43. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/ftp.py +0 -0
  44. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/gcp_bucket.py +0 -0
  45. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/waccess.py +0 -0
  46. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/utilitarios/validations/web_validator.py +0 -0
  47. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne/wacess.py +0 -0
  48. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne.egg-info/dependency_links.txt +0 -0
  49. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne.egg-info/requires.txt +0 -0
  50. {csc_cia_stne-0.1.0 → csc_cia_stne-0.1.1}/src/csc_cia_stne.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csc_cia_stne
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs
5
5
  License: MIT
6
6
  Keywords: karavela,csc,cia,stone,rpa,botcity,stne
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "csc_cia_stne"
7
- version = "0.1.00"
7
+ version = "0.1.01"
8
8
  license = { text = "MIT" }
9
9
  description = "Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs"
10
10
  keywords = ["karavela", "csc", "cia", "stone", "rpa", "botcity", "stne"]
@@ -0,0 +1,2 @@
1
+ from .web_screen_selenium import WebScreenSelenium
2
+ from .web_screen_botcity import WebScreenBotCity
@@ -0,0 +1,84 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class WebScreenAbstract(ABC):
5
+ """
6
+ Classe abstrata que define a interface para interações com a tela web.
7
+ Métodos Abstratos:
8
+ configuracao_inicial():
9
+ Configura o ambiente inicial para interações com a tela web.
10
+ click_on_screen(target: str, timeout: int = 10):
11
+ Clica em um elemento na tela web.
12
+ input_value(target: str, value: str, clear: bool = True):
13
+ Insere um valor em um campo de entrada na tela web.
14
+ select_value(target: str, value: str):
15
+ Seleciona um valor em um campo de seleção na tela web.
16
+ """
17
+
18
+ @abstractmethod
19
+ def select_one_element(
20
+ self,
21
+ target: str,
22
+ time: int = 15,
23
+ webdrive_type: str = "visibilidade_do_elemento",
24
+ ):
25
+ """
26
+ Seleciona um único elemento na página da web com base no alvo especificado.
27
+
28
+ Args:
29
+ target (str): O seletor ou identificador do elemento a ser selecionado.
30
+ time (int, opcional): O tempo máximo (em segundos) para aguardar o elemento estar disponível.
31
+ O padrão é 15 segundos.
32
+ webdrive_type (str, opcional): O tipo de condição de espera para o elemento.
33
+ Pode ser, por exemplo, "visibilidade_do_elemento". O padrão é "visibilidade_do_elemento".
34
+
35
+ Raises:
36
+ NotImplementedError: Indica que o método ainda não foi implementado.
37
+ """
38
+ raise NotImplementedError("Método 'select_element' ainda não implementado.")
39
+
40
+ @abstractmethod
41
+ def select_elements(
42
+ self,
43
+ target: str,
44
+ time: int = 15,
45
+ ):
46
+ """
47
+ Seleciona elementos na tela com base no alvo especificado.
48
+
49
+ Args:
50
+ target (str): O identificador do elemento ou grupo de elementos a serem selecionados.
51
+ time (int, opcional): O tempo máximo, em segundos, para aguardar a seleção dos elementos.
52
+ O padrão é 15 segundos.
53
+
54
+ Raises:
55
+ NotImplementedError: Exceção levantada indicando que o método ainda não foi implementado.
56
+ """
57
+ raise NotImplementedError("Método 'select_elements' ainda não implementado.")
58
+
59
+ @abstractmethod
60
+ def close_tab(self):
61
+ """
62
+ Fecha a aba atual do navegador.
63
+ Este método deve ser implementado para fechar a aba ativa do navegador.
64
+ """
65
+ raise NotImplementedError("Método 'close_tab' ainda não implementado.")
66
+
67
+ @abstractmethod
68
+ def get_driver(self):
69
+ """
70
+ Retorna o driver da instância atual.
71
+ Este método deve ser implementado para retornar a instância do driver web utilizado.
72
+ """
73
+ raise NotImplementedError("Método 'get_driver' ainda não implementado.")
74
+
75
+ @abstractmethod
76
+ def change_tab(self, tab_index: int):
77
+ """
78
+ Altera para a aba especificada pelo índice.
79
+ Args:
80
+ tab_index (int): Índice da aba para a qual mudar (0 para a primeira aba).
81
+ Raises:
82
+ NotImplementedError: Indica que o método ainda não foi implementado.
83
+ """
84
+ raise NotImplementedError("Método 'change_tab' ainda não implementado.")
@@ -0,0 +1,285 @@
1
+ from selenium.webdriver.common.by import By
2
+ from webdriver_manager.chrome import ChromeDriverManager
3
+ from selenium.common.exceptions import (
4
+ TimeoutException,
5
+ WebDriverException,
6
+ NoSuchElementException,
7
+ )
8
+
9
+ # Botcity
10
+ from botcity.web import WebBot, Browser
11
+ from botcity.web.util import element_as_select
12
+ from .web_screen_abstract import WebScreenAbstract
13
+
14
+
15
+ class WebScreenBotCity(WebScreenAbstract):
16
+ """
17
+ Classe que implementa a interface WebScreenAbstract usando BotCity.
18
+ Métodos:
19
+ configuracao_inicial():
20
+ Configura o ambiente inicial para interações com a tela web usando BotCity.
21
+ click_on_screen(target: str, timeout: int = 10):
22
+ Clica em um elemento na tela web usando BotCity.
23
+ input_value(target: str, value: str, clear: bool = True):
24
+ Insere um valor em um campo de entrada na tela web usando BotCity.
25
+ select_value(target: str, value: str):
26
+ Seleciona um valor em um campo de seleção na tela web usando BotCity.
27
+ """
28
+
29
+ def __init__(
30
+ self,
31
+ headless: bool = True,
32
+ disable_gpu: bool = True,
33
+ no_sandbox: bool = True,
34
+ timeout: int = 10,
35
+ security: bool = False,
36
+ ):
37
+ """
38
+ Inicializa a classe com as configurações para o WebBot.
39
+ Args:
40
+ headless (bool): Define se o navegador será executado em modo headless (sem interface gráfica).
41
+ Padrão é True.
42
+ disable_gpu (bool): Define se o uso de GPU será desativado no navegador. Padrão é True.
43
+ no_sandbox (bool): Define se o navegador será executado sem o modo sandbox. Padrão é True.
44
+ timeout (int): Tempo limite (em segundos) para operações realizadas pelo WebBot. Padrão é 10.
45
+ security (bool): Define se configurações de segurança adicionais serão aplicadas. Padrão é False.
46
+ Raises:
47
+ ValueError: Caso ocorra algum erro durante a inicialização da classe.
48
+ """
49
+ self.web_bot = None
50
+ self.timeout = timeout
51
+ self.security = security
52
+ self.screenshot = []
53
+ try:
54
+
55
+ # Criação do drive para botcity
56
+
57
+ self.web_bot = WebBot()
58
+
59
+ # Configurar o navegador (por exemplo, Chrome)
60
+ self.web_bot.browser = Browser.CHROME
61
+
62
+ self.web_bot.driver_path = ChromeDriverManager().install()
63
+
64
+ # Configurar as opções do Chrome
65
+ self.web_bot.headless = headless
66
+ self.web_bot.disable_gpu = disable_gpu
67
+ self.web_bot.no_sandbox = no_sandbox
68
+
69
+ except Exception as e:
70
+ raise ValueError("Erro na inicialização da classe:", e)
71
+
72
+ def select_one_element(self, target):
73
+ """
74
+ Clica em um elemento na tela identificado pelo seletor fornecido.
75
+ Args:
76
+ target (str): O seletor XPATH do elemento a ser clicado.
77
+ timeout (int, opcional): O tempo máximo (em segundos) para aguardar
78
+ que o elemento esteja disponível e não esteja obsoleto.
79
+ O padrão é 10 segundos.
80
+ Returns:
81
+ dict: Um dicionário contendo:
82
+ - "success" (bool): Indica se a operação foi bem-sucedida.
83
+ - "error" (Exception ou None): A exceção capturada em caso de falha,
84
+ ou None se não houver erro.
85
+ - "details" (None): Reservado para informações adicionais,
86
+ atualmente sempre retorna None.
87
+ Raises:
88
+ Exception: Qualquer exceção capturada durante a execução será retornada
89
+ no campo "error" do dicionário de retorno.
90
+ """
91
+ try:
92
+ element_click = self.web_bot.find_element(target, By.XPATH)
93
+ self.web_bot.wait_for_stale_element(
94
+ element=element_click, timeout=self.timeout
95
+ )
96
+ return {"success": True, "error": None, "element": element_click}
97
+ except NoSuchElementException:
98
+ return {
99
+ "success": False,
100
+ "error": f"Elemento com o seletor '{target}' não encontrado.",
101
+ }
102
+ except TimeoutException:
103
+ return {
104
+ "success": False,
105
+ "error": f"Tempo limite excedido ao tentar localizar o elemento com o seletor '{target}'.",
106
+ }
107
+ except Exception as e:
108
+ return {"success": False, "error": e}
109
+
110
+ def close_tab(self):
111
+ try:
112
+ """
113
+ Fecha a aba atual do navegador.
114
+ Este método tenta fechar a aba ativa do navegador utilizando o método `close_tab` do WebBot.
115
+ Caso ocorra algum erro durante o processo, uma exceção será levantada com uma mensagem descritiva.
116
+ """
117
+ self.web_bot.close_page()
118
+ return {"success": True, "error": None}
119
+ except WebDriverException as e:
120
+ return {"success": False, "error": f"Erro ao fechar a aba: {e}"}
121
+ except TimeoutException:
122
+ return {
123
+ "success": False,
124
+ "error": "Tempo limite excedido ao tentar fechar a aba.",
125
+ }
126
+ except Exception as e:
127
+ return {"success": False, "error": f"Erro ao fechar a aba: {e}"}
128
+
129
+ def select_elements(self, target):
130
+ """
131
+ Clica em um elemento na tela identificado pelo seletor fornecido.
132
+ Args:
133
+ target (str): O seletor XPATH do elemento a ser clicado.
134
+ timeout (int, opcional): O tempo máximo (em segundos) para aguardar
135
+ que o elemento esteja disponível e não esteja obsoleto.
136
+ O padrão é 10 segundos.
137
+ Returns:
138
+ dict: Um dicionário contendo:
139
+ - "success" (bool): Indica se a operação foi bem-sucedida.
140
+ - "error" (Exception ou None): A exceção capturada em caso de falha,
141
+ ou None se não houver erro.
142
+ - "details" (None): Reservado para informações adicionais,
143
+ atualmente sempre retorna None.
144
+ Raises:
145
+ Exception: Qualquer exceção capturada durante a execução será retornada
146
+ no campo "error" do dicionário de retorno.
147
+ """
148
+ try:
149
+ element_click = self.web_bot.find_elements(target, By.XPATH)
150
+ self.web_bot.wait_for_stale_element(
151
+ element=element_click, timeout=self.timeout
152
+ )
153
+ return {"success": True, "error": None, "element": element_click}
154
+ except NoSuchElementException:
155
+ return {
156
+ "success": False,
157
+ "error": f"Elemento com o seletor '{target}' não encontrado.",
158
+ }
159
+ except TimeoutException:
160
+ return {
161
+ "success": False,
162
+ "error": f"Tempo limite excedido ao tentar localizar o elemento com o seletor '{target}'.",
163
+ }
164
+ except Exception as e:
165
+ return {"success": False, "error": e}
166
+
167
+ def input_value(self, target: str, value: str, clear: bool = True):
168
+ """
169
+ Insere um valor em um elemento da página web identificado pelo seletor XPath.
170
+
171
+ Args:
172
+ target (str): O seletor XPath do elemento onde o valor será inserido.
173
+ value (str): O valor a ser inserido no elemento.
174
+ clear (bool, opcional): Indica se o campo deve ser limpo antes de inserir o valor.
175
+ O padrão é True.
176
+
177
+ Returns:
178
+ dict: Um dicionário contendo:
179
+ - "success" (bool): Indica se a operação foi bem-sucedida.
180
+ - "details" (None): Reservado para informações adicionais (atualmente não utilizado).
181
+ - "error" (str ou Exception): Mensagem de erro ou exceção, caso ocorra.
182
+
183
+ Exceções Tratadas:
184
+ - NoSuchElementException: Lançada quando o elemento não é encontrado.
185
+ - TimeoutException: Lançada quando o tempo limite para localizar o elemento é excedido.
186
+ - Exception: Captura qualquer outra exceção que possa ocorrer.
187
+
188
+ """
189
+ try:
190
+ element_input = self.web_bot.find_element(target, By.XPATH)
191
+ self.web_bot.wait_for_stale_element(
192
+ element=element_input, timeout=self.timeout
193
+ )
194
+ if clear:
195
+ element_input.clear()
196
+ element_input.send_keys(value)
197
+ return {"success": True, "error": None}
198
+ except NoSuchElementException:
199
+ return {
200
+ "success": False,
201
+ "details": None,
202
+ "error": f"Elemento com o seletor '{target}' não encontrado.",
203
+ }
204
+ except TimeoutException:
205
+ return {
206
+ "success": False,
207
+ "details": None,
208
+ "error": f"Tempo limite excedido ao tentar localizar o elemento com o seletor '{target}'.",
209
+ }
210
+ except Exception as e:
211
+ return {"success": False, "details": None, "error": e}
212
+
213
+ def select_value(self, target: str, value: str):
214
+ """
215
+ Seleciona um valor em um elemento do tipo <select> na página da web.
216
+
217
+ Args:
218
+ target (str): O seletor XPath do elemento <select> que será manipulado.
219
+ value (str): O valor que será selecionado no elemento <select>.
220
+
221
+ Returns:
222
+ dict: Um dicionário contendo:
223
+ - "success" (bool): Indica se a operação foi bem-sucedida.
224
+ - "details" (None): Reservado para informações adicionais (atualmente não utilizado).
225
+ - "error" (str ou Exception): Mensagem de erro em caso de falha ou a exceção capturada.
226
+
227
+ Exceções Tratadas:
228
+ - NoSuchElementException: Lançada quando o elemento com o seletor especificado não é encontrado.
229
+ - TimeoutException: Lançada quando o tempo limite para localizar o elemento é excedido.
230
+ - Exception: Captura qualquer outra exceção inesperada.
231
+
232
+ Observação:
233
+ Certifique-se de que o elemento identificado pelo seletor seja um elemento <select> válido.
234
+ """
235
+ try:
236
+ element_select = self.web_bot.find_element(target, By.XPATH)
237
+ self.web_bot.wait_for_stale_element(
238
+ element=element_select, timeout=self.timeout
239
+ )
240
+ element_select = element_as_select(element_select)
241
+ element_select.select_by_value(value)
242
+ return {"success": True, "error": None}
243
+ except NoSuchElementException:
244
+ return {
245
+ "success": False,
246
+ "details": None,
247
+ "error": f"Elemento com o seletor '{target}' não encontrado.",
248
+ }
249
+ except TimeoutException:
250
+ return {
251
+ "success": False,
252
+ "details": None,
253
+ "error": f"Tempo limite excedido ao tentar localizar o elemento com o seletor '{target}'.",
254
+ }
255
+ except Exception as e:
256
+ return {"success": False, "details": None, "error": e}
257
+
258
+ def get_driver(self):
259
+ """
260
+ Retorna a instância do driver web associada ao bot.
261
+
262
+ Returns:
263
+ WebDriver: A instância do driver web utilizada pelo bot.
264
+ """
265
+ return self.web_bot
266
+
267
+ def change_tab(self, tab_index: int):
268
+ try:
269
+ """
270
+ Altera para a aba especificada pelo índice.
271
+ Args:
272
+ tab_index (int): Índice da aba para a qual mudar (0 para a primeira aba).
273
+ Raises:
274
+ IndexError: Se o índice fornecido não corresponder a uma aba existente.
275
+ Exception: Para outros erros que possam ocorrer ao tentar mudar de aba.
276
+ """
277
+ self.web_bot.activate_tab(tab_index)
278
+ return {"success": True, "error": None}
279
+ except IndexError:
280
+ return {
281
+ "success": False,
282
+ "error": f"A aba com índice {tab_index} não existe.",
283
+ }
284
+ except Exception as e:
285
+ return {"success": False, "error": f"Erro ao mudar de aba: {e}"}