rpa-suite 1.4.5__tar.gz → 1.4.6__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.
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/PKG-INFO +59 -39
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/README.md +57 -38
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/__init__.py +2 -2
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/__init__.py +20 -4
- rpa_suite-1.4.6/rpa_suite/core/browser.py +299 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/file.py +1 -1
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite.egg-info/PKG-INFO +59 -39
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite.egg-info/requires.txt +1 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/setup.py +2 -2
- rpa_suite-1.4.5/rpa_suite/core/browser.py +0 -166
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/LICENSE +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/clock.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/date.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/dir.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/email.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/log.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/print.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/regex.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/core/validate.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/__create_log_dir.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/__create_ss_dir.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/__init__.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/_functions_logger.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/_logger.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/_printer.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/_variables.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/functions/_variables_uru.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/suite.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/utils/__init__.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite/utils/system.py +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite.egg-info/SOURCES.txt +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite.egg-info/dependency_links.txt +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/rpa_suite.egg-info/top_level.txt +0 -0
- {rpa_suite-1.4.5 → rpa_suite-1.4.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: rpa_suite
|
3
|
-
Version: 1.4.
|
3
|
+
Version: 1.4.6
|
4
4
|
Summary: Conjunto de ferramentas essenciais para Automação RPA com Python, que facilitam o dia a dia de desenvolvimento.
|
5
5
|
Author: Camilo Costa de Carvalho
|
6
6
|
Author-email: camilo.carvalho@triasoftware.com.br
|
@@ -25,6 +25,7 @@ Requires-Dist: loguru
|
|
25
25
|
Requires-Dist: typing
|
26
26
|
Requires-Dist: pillow
|
27
27
|
Requires-Dist: pyautogui
|
28
|
+
Requires-Dist: requests
|
28
29
|
Dynamic: author
|
29
30
|
Dynamic: author-email
|
30
31
|
Dynamic: classifier
|
@@ -54,13 +55,16 @@ Dynamic: summary
|
|
54
55
|
|
55
56
|
## Sumário do conteudo
|
56
57
|
|
58
|
+
- [O que é?](#o-que-é)
|
59
|
+
- [Sumário do conteudo](#sumário-do-conteudo)
|
57
60
|
- [Destaque](#destaque)
|
58
61
|
- [Objetivo](#objetivo)
|
59
62
|
- [Instalação](#instalação)
|
60
63
|
- [Exemplo](#exemplo)
|
61
64
|
- [Dependências](#dependências)
|
62
65
|
- [Estrutura do módulo](#estrutura-do-módulo)
|
63
|
-
- [
|
66
|
+
- [Release](#release)
|
67
|
+
- [Notas da atualização: 1.4.6](#notas-da-atualização-146)
|
64
68
|
- [Mais Sobre](#mais-sobre)
|
65
69
|
|
66
70
|
## Destaque
|
@@ -94,17 +98,17 @@ ou no conda:
|
|
94
98
|
conda install -c conda-forge rpa-suite
|
95
99
|
```
|
96
100
|
|
97
|
-
Após instalação basta fazer a importação do modulo
|
101
|
+
Após instalação basta fazer a importação do modulo rpa que ja tera um objeto instanciado de ``suite``:
|
98
102
|
|
99
103
|
```python
|
100
|
-
from rpa_suite import
|
104
|
+
from rpa_suite import rpa
|
101
105
|
```
|
102
106
|
|
103
107
|
Feito isso já estará pronto para o uso:
|
104
108
|
|
105
109
|
```python
|
106
110
|
# function send mail by SMTP
|
107
|
-
rpa.send_mail(...)
|
111
|
+
rpa.email.send_mail(...)
|
108
112
|
```
|
109
113
|
|
110
114
|
> [!NOTE]
|
@@ -121,21 +125,24 @@ rpa.send_mail(...)
|
|
121
125
|
> Opcionalmente você pode querer desinstalar as libs que foram inclusas no projeto, sendo assim:
|
122
126
|
|
123
127
|
```python
|
124
|
-
>>> python -m pip uninstall loguru mail_validator colorama
|
128
|
+
>>> python -m pip uninstall loguru mail_validator colorama pillow pyautogui
|
125
129
|
```
|
126
130
|
|
127
131
|
## Exemplo
|
128
132
|
|
129
133
|
Do módulo principal, importe a suite. Ela retorna uma instância do Objeto de classe Rpa_suite, onde possui variáveis apontando para todas funções dos submódulos:
|
130
134
|
|
131
|
-
from rpa_suite import
|
135
|
+
from rpa_suite import rpa
|
132
136
|
|
133
|
-
#
|
134
|
-
rpa.
|
137
|
+
# Exemplo com função de execução em horario especifico
|
138
|
+
rpa.clock.exec_at_hour('13:53', my_function, param_a, param_b)
|
135
139
|
|
136
|
-
# Usando submódulo clock para aguardar 30
|
140
|
+
# Usando submódulo clock para aguardar 30(seg) para executar minha função
|
137
141
|
time = 30
|
138
|
-
rpa.wait_for_exec(time, my_function, param1, param2)
|
142
|
+
rpa.clock.wait_for_exec(time, my_function, param1, param2)
|
143
|
+
|
144
|
+
# Usando submódulo email para envio de email por smtp comum
|
145
|
+
rpa.email.send_smtp(...)
|
139
146
|
|
140
147
|
## Dependências
|
141
148
|
|
@@ -159,44 +166,61 @@ No caso da função de screenshot é necessario ter as libs 'pyautogui' 'pillow'
|
|
159
166
|
|
160
167
|
## Estrutura do módulo
|
161
168
|
|
162
|
-
O módulo principal do rpa-suite é dividido em categorias. Cada categoria contém módulos com funções destinadas a
|
163
|
-
|
164
|
-
! Divisao e nomes de funções precisam ser atualizadas nesta sessão de Estrutura do módulo !
|
169
|
+
O módulo principal do rpa-suite é dividido em categorias. Cada categoria contém módulos com funções destinadas a categoria:
|
165
170
|
|
166
171
|
- **rpa_suite**
|
167
172
|
- **clock**
|
168
|
-
- **
|
169
|
-
- **
|
173
|
+
- **exec_at_hour** - Função que executa uma função no horário especificado "xx:yy", permitindo agendamento de tarefas com precisão.
|
174
|
+
- **wait_for_exec** - Função que aguarda um tempo em segundos antes de executar a função passada como argumento.
|
175
|
+
- **exec_and_wait** - Função que executa uma função e, em seguida, aguarda um tempo em segundos antes de continuar.
|
170
176
|
- **date**
|
171
|
-
- **
|
177
|
+
- **get_hms** - Função que retorna hora, minuto e segundo formatados como strings.
|
178
|
+
- **get_dmy** - Função que retorna dia, mês e ano formatados como strings.
|
172
179
|
- **email**
|
173
|
-
- **
|
180
|
+
- **send_smtp** - Função para envio de emails via SMTP com suporte a anexos e mensagens HTML, configurável e personalizável.
|
174
181
|
- **file**
|
175
|
-
- **
|
176
|
-
- **
|
177
|
-
- **
|
178
|
-
- **
|
182
|
+
- **screen_shot** - Função para capturar screenshots, criando diretórios e arquivos com nomes e caminhos personalizáveis.
|
183
|
+
- **flag_create** - Função para criar arquivos de flag indicando execução de processos.
|
184
|
+
- **flag_delete** - Função para deletar arquivos de flag após a execução de processos.
|
185
|
+
- **count_files** - Função para contar arquivos em diretórios, com suporte a extensões específicas.
|
186
|
+
- **directory**
|
187
|
+
- **create_temp_dir** - Função para criar diretórios temporários com nomes e caminhos personalizáveis.
|
188
|
+
- **delete_temp_dir** - Função para deletar diretórios temporários, com opção de remover arquivos contidos.
|
179
189
|
- **log**
|
180
|
-
- **
|
181
|
-
- **
|
182
|
-
- **
|
190
|
+
- **config_logger** - Função para configurar logs com suporte a arquivos e streams, utilizando a biblioteca Loguru.
|
191
|
+
- **log_start_run_debug** - Função para registrar logs de início de execução em nível de depuração.
|
192
|
+
- **log_debug** - Função para registrar logs em nível de depuração.
|
193
|
+
- **log_info** - Função para registrar logs em nível informativo.
|
194
|
+
- **log_warning** - Função para registrar logs em nível de aviso.
|
195
|
+
- **log_error** - Função para registrar logs em nível de erro.
|
196
|
+
- **log_critical** - Função para registrar logs em nível crítico.
|
197
|
+
- **printer**
|
198
|
+
- **success_print** - Função para imprimir mensagens de sucesso com destaque em verde.
|
199
|
+
- **alert_print** - Função para imprimir mensagens de alerta com destaque em amarelo.
|
200
|
+
- **info_print** - Função para imprimir mensagens informativas com destaque em ciano.
|
201
|
+
- **error_print** - Função para imprimir mensagens de erro com destaque em vermelho.
|
183
202
|
- **regex**
|
184
|
-
- **
|
203
|
+
- **check_pattern_in_text** - Função para verificar a presença de padrões em textos, com suporte a case-sensitive.
|
185
204
|
- **validate**
|
186
|
-
- **
|
187
|
-
- **
|
205
|
+
- **emails** - Função para validar listas de emails, retornando listas de emails válidos e inválidos.
|
206
|
+
- **word** - Função para buscar palavras ou padrões específicos em textos, com suporte a contagem de ocorrências.
|
207
|
+
- **browser**
|
208
|
+
- **start_browser** - Função para iniciar o navegador Chrome com suporte a depuração remota.
|
209
|
+
- **find_ele** - Função para localizar elementos na página utilizando estratégias de localização do Selenium.
|
210
|
+
- **get** - Função para navegar para URLs específicas.
|
211
|
+
- **close_browser** - Função para fechar o navegador e encerrar processos relacionados.
|
188
212
|
|
189
213
|
## Release
|
190
214
|
|
191
|
-
Versão: **Beta 1.4.
|
215
|
+
Versão: **Beta 1.4.6**
|
192
216
|
|
193
217
|
Lançamento: *20/02/2024*
|
194
218
|
|
195
|
-
Última atualização: *
|
219
|
+
Última atualização: *12/04/2025*
|
196
220
|
|
197
221
|
Status: Em desenvolvimento.
|
198
222
|
|
199
|
-
### Notas da atualização: 1.4.
|
223
|
+
### Notas da atualização: 1.4.6
|
200
224
|
|
201
225
|
- Mudança dos submodulos para Objetos, agora Rpa_suite é um Objeto de Suite que compoe diversos sub-objetos separados pelas mesmas categorias anteriormente ja definidas
|
202
226
|
- Reformulada a arquitetura do projeto para melhor coeção e menos subpastas e arquivos, agora a estrutura é mais simples e de melhor manutenção contendo apenas uma pasta core para o nucleo de nossos modulos, e uma pasta utils com ferramentas utilitarias que vamos adicionar varias novidades
|
@@ -212,13 +236,9 @@ Status: Em desenvolvimento.
|
|
212
236
|
## Mais Sobre
|
213
237
|
|
214
238
|
Para mais informações, visite nosso projeto no Github ou PyPi:
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
`<br>`
|
220
|
-
`<a href='https://pypi.org/project/rpa-suite/' target='_blank'>`
|
221
|
-
Ver projeto publicado no PyPI.
|
222
|
-
`</a>`
|
239
|
+
|
240
|
+
[Ver no GitHub](https://github.com/CamiloCCarvalho/rpa_suite)
|
241
|
+
|
242
|
+
[Ver projeto publicado no PyPI](https://pypi.org/project/rpa-suite/)
|
223
243
|
|
224
244
|
<hr>
|
@@ -16,13 +16,16 @@
|
|
16
16
|
|
17
17
|
## Sumário do conteudo
|
18
18
|
|
19
|
+
- [O que é?](#o-que-é)
|
20
|
+
- [Sumário do conteudo](#sumário-do-conteudo)
|
19
21
|
- [Destaque](#destaque)
|
20
22
|
- [Objetivo](#objetivo)
|
21
23
|
- [Instalação](#instalação)
|
22
24
|
- [Exemplo](#exemplo)
|
23
25
|
- [Dependências](#dependências)
|
24
26
|
- [Estrutura do módulo](#estrutura-do-módulo)
|
25
|
-
- [
|
27
|
+
- [Release](#release)
|
28
|
+
- [Notas da atualização: 1.4.6](#notas-da-atualização-146)
|
26
29
|
- [Mais Sobre](#mais-sobre)
|
27
30
|
|
28
31
|
## Destaque
|
@@ -56,17 +59,17 @@ ou no conda:
|
|
56
59
|
conda install -c conda-forge rpa-suite
|
57
60
|
```
|
58
61
|
|
59
|
-
Após instalação basta fazer a importação do modulo
|
62
|
+
Após instalação basta fazer a importação do modulo rpa que ja tera um objeto instanciado de ``suite``:
|
60
63
|
|
61
64
|
```python
|
62
|
-
from rpa_suite import
|
65
|
+
from rpa_suite import rpa
|
63
66
|
```
|
64
67
|
|
65
68
|
Feito isso já estará pronto para o uso:
|
66
69
|
|
67
70
|
```python
|
68
71
|
# function send mail by SMTP
|
69
|
-
rpa.send_mail(...)
|
72
|
+
rpa.email.send_mail(...)
|
70
73
|
```
|
71
74
|
|
72
75
|
> [!NOTE]
|
@@ -83,21 +86,24 @@ rpa.send_mail(...)
|
|
83
86
|
> Opcionalmente você pode querer desinstalar as libs que foram inclusas no projeto, sendo assim:
|
84
87
|
|
85
88
|
```python
|
86
|
-
>>> python -m pip uninstall loguru mail_validator colorama
|
89
|
+
>>> python -m pip uninstall loguru mail_validator colorama pillow pyautogui
|
87
90
|
```
|
88
91
|
|
89
92
|
## Exemplo
|
90
93
|
|
91
94
|
Do módulo principal, importe a suite. Ela retorna uma instância do Objeto de classe Rpa_suite, onde possui variáveis apontando para todas funções dos submódulos:
|
92
95
|
|
93
|
-
from rpa_suite import
|
96
|
+
from rpa_suite import rpa
|
94
97
|
|
95
|
-
#
|
96
|
-
rpa.
|
98
|
+
# Exemplo com função de execução em horario especifico
|
99
|
+
rpa.clock.exec_at_hour('13:53', my_function, param_a, param_b)
|
97
100
|
|
98
|
-
# Usando submódulo clock para aguardar 30
|
101
|
+
# Usando submódulo clock para aguardar 30(seg) para executar minha função
|
99
102
|
time = 30
|
100
|
-
rpa.wait_for_exec(time, my_function, param1, param2)
|
103
|
+
rpa.clock.wait_for_exec(time, my_function, param1, param2)
|
104
|
+
|
105
|
+
# Usando submódulo email para envio de email por smtp comum
|
106
|
+
rpa.email.send_smtp(...)
|
101
107
|
|
102
108
|
## Dependências
|
103
109
|
|
@@ -121,44 +127,61 @@ No caso da função de screenshot é necessario ter as libs 'pyautogui' 'pillow'
|
|
121
127
|
|
122
128
|
## Estrutura do módulo
|
123
129
|
|
124
|
-
O módulo principal do rpa-suite é dividido em categorias. Cada categoria contém módulos com funções destinadas a
|
125
|
-
|
126
|
-
! Divisao e nomes de funções precisam ser atualizadas nesta sessão de Estrutura do módulo !
|
130
|
+
O módulo principal do rpa-suite é dividido em categorias. Cada categoria contém módulos com funções destinadas a categoria:
|
127
131
|
|
128
132
|
- **rpa_suite**
|
129
133
|
- **clock**
|
130
|
-
- **
|
131
|
-
- **
|
134
|
+
- **exec_at_hour** - Função que executa uma função no horário especificado "xx:yy", permitindo agendamento de tarefas com precisão.
|
135
|
+
- **wait_for_exec** - Função que aguarda um tempo em segundos antes de executar a função passada como argumento.
|
136
|
+
- **exec_and_wait** - Função que executa uma função e, em seguida, aguarda um tempo em segundos antes de continuar.
|
132
137
|
- **date**
|
133
|
-
- **
|
138
|
+
- **get_hms** - Função que retorna hora, minuto e segundo formatados como strings.
|
139
|
+
- **get_dmy** - Função que retorna dia, mês e ano formatados como strings.
|
134
140
|
- **email**
|
135
|
-
- **
|
141
|
+
- **send_smtp** - Função para envio de emails via SMTP com suporte a anexos e mensagens HTML, configurável e personalizável.
|
136
142
|
- **file**
|
137
|
-
- **
|
138
|
-
- **
|
139
|
-
- **
|
140
|
-
- **
|
143
|
+
- **screen_shot** - Função para capturar screenshots, criando diretórios e arquivos com nomes e caminhos personalizáveis.
|
144
|
+
- **flag_create** - Função para criar arquivos de flag indicando execução de processos.
|
145
|
+
- **flag_delete** - Função para deletar arquivos de flag após a execução de processos.
|
146
|
+
- **count_files** - Função para contar arquivos em diretórios, com suporte a extensões específicas.
|
147
|
+
- **directory**
|
148
|
+
- **create_temp_dir** - Função para criar diretórios temporários com nomes e caminhos personalizáveis.
|
149
|
+
- **delete_temp_dir** - Função para deletar diretórios temporários, com opção de remover arquivos contidos.
|
141
150
|
- **log**
|
142
|
-
- **
|
143
|
-
- **
|
144
|
-
- **
|
151
|
+
- **config_logger** - Função para configurar logs com suporte a arquivos e streams, utilizando a biblioteca Loguru.
|
152
|
+
- **log_start_run_debug** - Função para registrar logs de início de execução em nível de depuração.
|
153
|
+
- **log_debug** - Função para registrar logs em nível de depuração.
|
154
|
+
- **log_info** - Função para registrar logs em nível informativo.
|
155
|
+
- **log_warning** - Função para registrar logs em nível de aviso.
|
156
|
+
- **log_error** - Função para registrar logs em nível de erro.
|
157
|
+
- **log_critical** - Função para registrar logs em nível crítico.
|
158
|
+
- **printer**
|
159
|
+
- **success_print** - Função para imprimir mensagens de sucesso com destaque em verde.
|
160
|
+
- **alert_print** - Função para imprimir mensagens de alerta com destaque em amarelo.
|
161
|
+
- **info_print** - Função para imprimir mensagens informativas com destaque em ciano.
|
162
|
+
- **error_print** - Função para imprimir mensagens de erro com destaque em vermelho.
|
145
163
|
- **regex**
|
146
|
-
- **
|
164
|
+
- **check_pattern_in_text** - Função para verificar a presença de padrões em textos, com suporte a case-sensitive.
|
147
165
|
- **validate**
|
148
|
-
- **
|
149
|
-
- **
|
166
|
+
- **emails** - Função para validar listas de emails, retornando listas de emails válidos e inválidos.
|
167
|
+
- **word** - Função para buscar palavras ou padrões específicos em textos, com suporte a contagem de ocorrências.
|
168
|
+
- **browser**
|
169
|
+
- **start_browser** - Função para iniciar o navegador Chrome com suporte a depuração remota.
|
170
|
+
- **find_ele** - Função para localizar elementos na página utilizando estratégias de localização do Selenium.
|
171
|
+
- **get** - Função para navegar para URLs específicas.
|
172
|
+
- **close_browser** - Função para fechar o navegador e encerrar processos relacionados.
|
150
173
|
|
151
174
|
## Release
|
152
175
|
|
153
|
-
Versão: **Beta 1.4.
|
176
|
+
Versão: **Beta 1.4.6**
|
154
177
|
|
155
178
|
Lançamento: *20/02/2024*
|
156
179
|
|
157
|
-
Última atualização: *
|
180
|
+
Última atualização: *12/04/2025*
|
158
181
|
|
159
182
|
Status: Em desenvolvimento.
|
160
183
|
|
161
|
-
### Notas da atualização: 1.4.
|
184
|
+
### Notas da atualização: 1.4.6
|
162
185
|
|
163
186
|
- Mudança dos submodulos para Objetos, agora Rpa_suite é um Objeto de Suite que compoe diversos sub-objetos separados pelas mesmas categorias anteriormente ja definidas
|
164
187
|
- Reformulada a arquitetura do projeto para melhor coeção e menos subpastas e arquivos, agora a estrutura é mais simples e de melhor manutenção contendo apenas uma pasta core para o nucleo de nossos modulos, e uma pasta utils com ferramentas utilitarias que vamos adicionar varias novidades
|
@@ -174,13 +197,9 @@ Status: Em desenvolvimento.
|
|
174
197
|
## Mais Sobre
|
175
198
|
|
176
199
|
Para mais informações, visite nosso projeto no Github ou PyPi:
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
`<br>`
|
182
|
-
`<a href='https://pypi.org/project/rpa-suite/' target='_blank'>`
|
183
|
-
Ver projeto publicado no PyPI.
|
184
|
-
`</a>`
|
200
|
+
|
201
|
+
[Ver no GitHub](https://github.com/CamiloCCarvalho/rpa_suite)
|
202
|
+
|
203
|
+
[Ver projeto publicado no PyPI](https://pypi.org/project/rpa-suite/)
|
185
204
|
|
186
205
|
<hr>
|
@@ -26,7 +26,7 @@
|
|
26
26
|
``printer``: Functions for formatted output
|
27
27
|
``regex``: Operations with regular expressions
|
28
28
|
``validate``: Data validation functions
|
29
|
-
``Browser``: Object Browser automation functions
|
29
|
+
``Browser``: Object Browser automation functions (neeeds Selenium and Webdriver_Manager)
|
30
30
|
|
31
31
|
pt-br
|
32
32
|
-----
|
@@ -56,7 +56,7 @@
|
|
56
56
|
``printer``: Funções para output formatado
|
57
57
|
``regex``: Operações com expressões regulares
|
58
58
|
``validate``: Funções de validação de dados
|
59
|
-
``Browser``: Objeto de Automação de Navegadores
|
59
|
+
``Browser``: Objeto de Automação de Navegadores (necessario Selenium e Webdriver_Manager)
|
60
60
|
"""
|
61
61
|
|
62
62
|
from .suite import rpa
|
@@ -3,9 +3,12 @@
|
|
3
3
|
"""
|
4
4
|
The Core module is where we can import all Sub-Objects used by the rpa_suite module separately, categorized by their respective classes based on functionality. However, we can also use them through the main rpa object using the following syntax:
|
5
5
|
>>> from rpa_suite import rpa
|
6
|
-
>>> rpa.clock.wait_for_exec()
|
6
|
+
>>> rpa.clock.wait_for_exec(foo)
|
7
7
|
>>> rpa.file.screen_shot() ...
|
8
|
-
|
8
|
+
or
|
9
|
+
>>> from rpa_suite.core.clock import Clock
|
10
|
+
>>> clock = Clock()
|
11
|
+
>>> clock.wait_for_exec()
|
9
12
|
|
10
13
|
pt-br
|
11
14
|
----------
|
@@ -13,9 +16,13 @@ O módulo Core é de onde podemos importar todos os Sub-Objetos usados pelo mód
|
|
13
16
|
>>> from rpa_suite import rpa
|
14
17
|
>>> rpa.clock.wait_for_exec()
|
15
18
|
>>> rpa.file.screen_shot() ...
|
16
|
-
|
19
|
+
ou
|
20
|
+
>>> from rpa_suite.core.clock import Clock
|
21
|
+
>>> clock = Clock()
|
22
|
+
>>> clock.wait_for_exec(foo)
|
17
23
|
|
18
24
|
"""
|
25
|
+
|
19
26
|
from .clock import Clock
|
20
27
|
from .date import Date
|
21
28
|
from .dir import Directory
|
@@ -25,4 +32,13 @@ from .log import Log
|
|
25
32
|
from .print import Print
|
26
33
|
from .regex import Regex
|
27
34
|
from .validate import Validate
|
28
|
-
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
# On this case, we are importing the Browser class only if the selenium and webdriver_manager modules are installed.
|
39
|
+
# This is useful to avoid unnecessary imports and dependencies if the user does not need the Browser functionality.
|
40
|
+
import importlib.util
|
41
|
+
|
42
|
+
# from .browser import Browser
|
43
|
+
if importlib.util.find_spec("selenium") and importlib.util.find_spec("webdriver_manager"):
|
44
|
+
from .browser import Browser
|
@@ -0,0 +1,299 @@
|
|
1
|
+
# default import
|
2
|
+
import os, requests
|
3
|
+
|
4
|
+
# imports
|
5
|
+
from rpa_suite.functions._printer import error_print, alert_print, success_print
|
6
|
+
|
7
|
+
from selenium import webdriver
|
8
|
+
from selenium.webdriver.common.by import By
|
9
|
+
from selenium.webdriver.chrome.options import Options
|
10
|
+
from selenium.webdriver.support.ui import WebDriverWait
|
11
|
+
from selenium.webdriver.support import expected_conditions as EC
|
12
|
+
from webdriver_manager.chrome import ChromeDriverManager
|
13
|
+
from time import sleep
|
14
|
+
|
15
|
+
|
16
|
+
class Browser():
|
17
|
+
|
18
|
+
"""
|
19
|
+
Browser Object for Automation (Work in Progress)
|
20
|
+
This class provides an interface for automating browser interactions using
|
21
|
+
Google Chrome with a debugging port. It includes methods for starting,
|
22
|
+
configuring, navigating, and interacting with the browser. The implementation
|
23
|
+
is still under development and may require further enhancements.
|
24
|
+
|
25
|
+
Attributes:
|
26
|
+
driver: The WebDriver instance used to control the browser.
|
27
|
+
port (int): The debugging port used to connect to the browser. Default is 9393.
|
28
|
+
path_driver (str): The path to the ChromeDriver executable.
|
29
|
+
|
30
|
+
Methods:
|
31
|
+
__init__(port: int = 9393, close_all_chrome_on_this_port: bool = False):
|
32
|
+
Initializes the Browser object with the specified debugging port and
|
33
|
+
optionally closes all Chrome instances running on the same port.
|
34
|
+
configure_browser() -> None:
|
35
|
+
Configures the browser with debugging options and initializes the WebDriver.
|
36
|
+
start_browser(close_chrome_on_this_port: bool = True, display_message: bool = False):
|
37
|
+
Starts the Chrome browser with the specified debugging port and initializes
|
38
|
+
the WebDriver.
|
39
|
+
find_ele(value, by=By.XPATH, timeout=12, display_message=True):
|
40
|
+
Finds a single element on the page using the specified locator strategy.
|
41
|
+
get(url: str, display_message: bool = False):
|
42
|
+
Navigates the browser to the specified URL.
|
43
|
+
_close_all_chrome():
|
44
|
+
Closes all Chrome processes forcefully.
|
45
|
+
close_browser(display_message: bool = False):
|
46
|
+
Closes the browser instance and terminates the associated Chrome processes.
|
47
|
+
|
48
|
+
pt-br
|
49
|
+
----------
|
50
|
+
Objeto Browser para Automação (Em Desenvolvimento)
|
51
|
+
Esta classe fornece uma interface para automação de interações com o navegador
|
52
|
+
Google Chrome utilizando uma porta de depuração. Inclui métodos para iniciar,
|
53
|
+
configurar, navegar e interagir com o navegador. A implementação ainda está em
|
54
|
+
desenvolvimento e pode requerer melhorias adicionais.
|
55
|
+
|
56
|
+
Atributos:
|
57
|
+
driver: A instância do WebDriver usada para controlar o navegador.
|
58
|
+
port (int): A porta de depuração usada para conectar ao navegador. O padrão é 9393.
|
59
|
+
path_driver (str): O caminho para o executável do ChromeDriver.
|
60
|
+
|
61
|
+
Métodos:
|
62
|
+
__init__(port: int = 9393, close_all_chrome_on_this_port: bool = False):
|
63
|
+
Inicializa o objeto Browser com a porta de depuração especificada e,
|
64
|
+
opcionalmente, fecha todas as instâncias do Chrome que estão sendo executadas
|
65
|
+
na mesma porta.
|
66
|
+
configure_browser() -> None:
|
67
|
+
Configura o navegador com opções de depuração e inicializa o WebDriver.
|
68
|
+
start_browser(close_chrome_on_this_port: bool = True, display_message: bool = False):
|
69
|
+
Inicia o navegador Chrome com a porta de depuração especificada e inicializa
|
70
|
+
o WebDriver.
|
71
|
+
find_ele(value, by=By.XPATH, timeout=12, display_message=True):
|
72
|
+
Localiza um único elemento na página usando a estratégia de localização especificada.
|
73
|
+
get(url: str, display_message: bool = False):
|
74
|
+
Navega o navegador para a URL especificada.
|
75
|
+
_close_all_chrome():
|
76
|
+
Fecha todos os processos do Chrome de forma forçada.
|
77
|
+
close_browser(display_message: bool = False):
|
78
|
+
Fecha a instância do navegador e termina os processos associados do Chrome.
|
79
|
+
"""
|
80
|
+
|
81
|
+
driver: None
|
82
|
+
port: int = None
|
83
|
+
path_driver = None
|
84
|
+
|
85
|
+
def __init__(self, port: int = 9393, close_all_chrome_on_this_port: bool = False):
|
86
|
+
self.port = port
|
87
|
+
self.path_driver = ChromeDriverManager().install()
|
88
|
+
|
89
|
+
if close_all_chrome_on_this_port: self._close_all_chrome()
|
90
|
+
...
|
91
|
+
|
92
|
+
def configure_browser(self) -> None:
|
93
|
+
"""
|
94
|
+
Configures the browser instance with specified options and initializes the WebDriver.
|
95
|
+
This method sets up the browser with debugging options, maximized window, and disables notifications.
|
96
|
+
It also verifies the existence of the ChromeDriver executable at the specified path before creating
|
97
|
+
the WebDriver instance.
|
98
|
+
Raises:
|
99
|
+
FileNotFoundError: If the specified path to the ChromeDriver executable does not exist.
|
100
|
+
Exception: For any other errors encountered during the browser configuration process.
|
101
|
+
"""
|
102
|
+
|
103
|
+
try:
|
104
|
+
# Use the absolute path from comment
|
105
|
+
|
106
|
+
options = Options()
|
107
|
+
options.add_experimental_option("debuggerAddress",
|
108
|
+
f"127.0.0.1:{str(self.port)}")
|
109
|
+
|
110
|
+
# Additional configs
|
111
|
+
options.add_argument("--start-maximized")
|
112
|
+
options.add_argument("--disable-notifications")
|
113
|
+
|
114
|
+
# Verifica se o caminho do driver está correto
|
115
|
+
if not os.path.exists(self.path_driver):
|
116
|
+
raise FileNotFoundError(f'O caminho do driver não foi encontrado: {self.path_driver}')
|
117
|
+
|
118
|
+
# Create driver with options and chromedriver path
|
119
|
+
self.driver = webdriver.Chrome(
|
120
|
+
#service=self.path_driver,
|
121
|
+
options=options,
|
122
|
+
keep_alive=True
|
123
|
+
)
|
124
|
+
|
125
|
+
except Exception as e:
|
126
|
+
error_print(f'Erro durante a função: {self.configure_browser.__name__}! Error: {str(e)}.')
|
127
|
+
|
128
|
+
def start_browser(self, close_chrome_on_this_port: bool = True, display_message: bool = False):
|
129
|
+
"""
|
130
|
+
Starts a Chrome browser instance with remote debugging enabled.
|
131
|
+
Args:
|
132
|
+
close_chrome_on_this_port (bool): If True, closes any existing Chrome instance using the specified debugging port before starting a new one. Defaults to True.
|
133
|
+
display_message (bool): If True, displays a success message upon successfully starting the browser. Defaults to False.
|
134
|
+
Raises:
|
135
|
+
Exception: If an error occurs while starting the browser or connecting to the debugging port.
|
136
|
+
Behavior:
|
137
|
+
- Closes any existing Chrome instance on the specified debugging port if `close_chrome_on_this_port` is True.
|
138
|
+
- Launches Chrome with the specified debugging port and user data directory.
|
139
|
+
- Waits until Chrome is fully initialized and accessible via the debugging port.
|
140
|
+
- Configures the browser instance using the `configure_browser` method.
|
141
|
+
- Optionally displays a success message if `display_message` is True.
|
142
|
+
"""
|
143
|
+
|
144
|
+
try:
|
145
|
+
if close_chrome_on_this_port: self.close_browser()
|
146
|
+
|
147
|
+
# Inicia o Chrome com debugging port
|
148
|
+
os.system(f'start chrome.exe --remote-debugging-port={str(self.port)} --user-data-dir="C:/temp/chrome_profile"')
|
149
|
+
|
150
|
+
# Aguardar até que o Chrome esteja realmente aberto
|
151
|
+
while True:
|
152
|
+
try:
|
153
|
+
# Tenta conectar ao Chrome na porta de depuração
|
154
|
+
response = requests.get(f'http://127.0.0.1:{self.port}/json')
|
155
|
+
if response.status_code == 200:
|
156
|
+
break # O Chrome está aberto
|
157
|
+
except requests.ConnectionError:
|
158
|
+
sleep(1) # Espera um segundo antes de tentar novamente
|
159
|
+
|
160
|
+
# Inicializa o Chrome com as opções
|
161
|
+
self.configure_browser()
|
162
|
+
|
163
|
+
if display_message: success_print(f'Browser: Iniciado com sucesso!')
|
164
|
+
|
165
|
+
except Exception as e:
|
166
|
+
error_print(f'Erro ao iniciar navegador: {str(e)}.')
|
167
|
+
|
168
|
+
|
169
|
+
def find_ele(self, value, by=By.XPATH, timeout=12, display_message=True):
|
170
|
+
"""
|
171
|
+
Locate and return a web element on the page using the specified locator strategy.
|
172
|
+
Args:
|
173
|
+
value (str): The locator value to identify the web element.
|
174
|
+
by (selenium.webdriver.common.by.By, optional): The locator strategy to use.
|
175
|
+
Defaults to By.XPATH.
|
176
|
+
timeout (int, optional): The maximum time to wait for the element to appear, in seconds.
|
177
|
+
Defaults to 12.
|
178
|
+
display_message (bool, optional): Whether to display an error message if the element
|
179
|
+
is not found. Defaults to True.
|
180
|
+
Returns:
|
181
|
+
selenium.webdriver.remote.webelement.WebElement: The located web element if found.
|
182
|
+
None: If the element is not found or an exception occurs.
|
183
|
+
Raises:
|
184
|
+
Exception: Propagates any exception encountered during the element search if
|
185
|
+
`display_message` is set to False.
|
186
|
+
"""
|
187
|
+
|
188
|
+
try:
|
189
|
+
sleep(2)
|
190
|
+
element = WebDriverWait(self.driver, timeout).until(
|
191
|
+
EC.presence_of_element_located((by, value))
|
192
|
+
); return element
|
193
|
+
|
194
|
+
except Exception as e:
|
195
|
+
|
196
|
+
if display_message:
|
197
|
+
error_print(f'Erro durante a função: {self.find_ele.__name__}! Error: {str(e)}.')
|
198
|
+
return None
|
199
|
+
else: return None
|
200
|
+
|
201
|
+
# find elements (needs implementation)
|
202
|
+
...
|
203
|
+
|
204
|
+
# navigate
|
205
|
+
def get(self, url: str, display_message: bool = False):
|
206
|
+
"""
|
207
|
+
Navigates the browser to the specified URL.
|
208
|
+
Args:
|
209
|
+
url (str): The URL to navigate to.
|
210
|
+
display_message (bool, optional): If True, displays a success message upon navigation. Defaults to False.
|
211
|
+
Raises:
|
212
|
+
Exception: If an error occurs while navigating to the URL, it logs the error message.
|
213
|
+
"""
|
214
|
+
|
215
|
+
try:
|
216
|
+
self.driver.get(url)
|
217
|
+
if display_message: success_print(f'Browser: Navegando para: {url}')
|
218
|
+
|
219
|
+
except Exception as e:
|
220
|
+
error_print(f'Erro ao navegar para a URL: {url}. Error: {str(e)}.')
|
221
|
+
|
222
|
+
|
223
|
+
def _close_all_browsers(self):
|
224
|
+
"""
|
225
|
+
Forcefully closes all instances of Google Chrome running on the system.
|
226
|
+
This method uses the `taskkill` command to terminate all processes with the name
|
227
|
+
"chrome.exe". Any errors during the execution of the command are silently ignored.
|
228
|
+
Note:
|
229
|
+
This method is specific to Windows operating systems and will not work on other platforms.
|
230
|
+
"""
|
231
|
+
|
232
|
+
try:
|
233
|
+
os.system('taskkill /F /IM chrome.exe >nul 2>&1')
|
234
|
+
except:
|
235
|
+
pass
|
236
|
+
|
237
|
+
|
238
|
+
def close_browser(self, display_message: bool = False):
|
239
|
+
"""
|
240
|
+
Fecha o navegador controlado pelo Selenium e encerra os processos relacionados ao Chrome.
|
241
|
+
Este método tenta fechar o navegador de forma ordenada utilizando os métodos `close` e `quit` do Selenium.
|
242
|
+
Caso esses métodos falhem, ele força o encerramento do processo do Chrome associado à porta de depuração remota.
|
243
|
+
Em último caso, pode encerrar todos os processos do Chrome relacionados à porta especificada.
|
244
|
+
Args:
|
245
|
+
display_message (bool): Indica se mensagens de status devem ser exibidas durante o processo de fechamento.
|
246
|
+
Comportamento:
|
247
|
+
- Tenta fechar o navegador utilizando `self.driver.close()` e `self.driver.quit()`.
|
248
|
+
- Aguarda um momento para liberar o processo.
|
249
|
+
- Força o encerramento do processo do Chrome associado à porta de depuração remota.
|
250
|
+
- Verifica se o processo foi encerrado e tenta métodos mais agressivos, se necessário.
|
251
|
+
- Em caso de falha crítica, tenta encerrar todos os processos do Chrome relacionados à porta especificada.
|
252
|
+
Exceções:
|
253
|
+
- Captura e exibe mensagens de erro caso ocorra falha ao fechar o navegador.
|
254
|
+
Observação:
|
255
|
+
Use com cautela, especialmente o encerramento extremo, pois pode afetar outros processos do Chrome em execução.
|
256
|
+
"""
|
257
|
+
|
258
|
+
try:
|
259
|
+
# Primeiro tenta fechar todas as janelas via Selenium
|
260
|
+
try:
|
261
|
+
self.driver.close()
|
262
|
+
except:
|
263
|
+
pass
|
264
|
+
|
265
|
+
# Depois tenta encerrar a sessão
|
266
|
+
try:
|
267
|
+
self.driver.quit()
|
268
|
+
except:
|
269
|
+
pass
|
270
|
+
|
271
|
+
# Aguarda um momento para o processo ser liberado
|
272
|
+
sleep(1)
|
273
|
+
|
274
|
+
# Força o fechamento do processo específico do Chrome
|
275
|
+
os.system(f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" >nul 2>&1')
|
276
|
+
|
277
|
+
# Verifica se o processo foi realmente terminado
|
278
|
+
check = os.system(f'tasklist /fi "imagename eq chrome.exe" /fi "commandline like *--remote-debugging-port={str(self.port)}*" >nul 2>&1')
|
279
|
+
|
280
|
+
if check == 0:
|
281
|
+
# Processo ainda existe, tenta método mais agressivo
|
282
|
+
os.system(f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" /t >nul 2>&1')
|
283
|
+
if display_message: alert_print(f'Browser: Fechado via força!')
|
284
|
+
|
285
|
+
else:
|
286
|
+
if display_message: success_print(f'Browser: Fechado com sucesso!')
|
287
|
+
|
288
|
+
except Exception as e:
|
289
|
+
|
290
|
+
|
291
|
+
try:
|
292
|
+
if display_message: alert_print(f'Erro ao fechar navegador: {str(e)}, Tentando meio mais forte!')
|
293
|
+
|
294
|
+
# Último recurso - mata todos os processos do Chrome (use com cautela)
|
295
|
+
os.system(f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" /t >nul 2>&1')
|
296
|
+
if display_message: alert_print(f'Browser: Fechado via força extrema!')
|
297
|
+
|
298
|
+
except Exception as error_ultimate:
|
299
|
+
if display_message: error_print(f'Falha crítica ao tentar fechar o navegador! Error: {str(error_ultimate)}!')
|
@@ -170,7 +170,7 @@ class File():
|
|
170
170
|
full_path_with_name = fr'{path_to_create}/{name_file}'
|
171
171
|
|
172
172
|
with open(full_path_with_name, 'w', encoding='utf-8') as file:
|
173
|
-
file.write('[
|
173
|
+
file.write('[RPA Suite] - Running Flag File')
|
174
174
|
if display_message: success_print("Flag file created.")
|
175
175
|
|
176
176
|
except Exception as e:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: rpa_suite
|
3
|
-
Version: 1.4.
|
3
|
+
Version: 1.4.6
|
4
4
|
Summary: Conjunto de ferramentas essenciais para Automação RPA com Python, que facilitam o dia a dia de desenvolvimento.
|
5
5
|
Author: Camilo Costa de Carvalho
|
6
6
|
Author-email: camilo.carvalho@triasoftware.com.br
|
@@ -25,6 +25,7 @@ Requires-Dist: loguru
|
|
25
25
|
Requires-Dist: typing
|
26
26
|
Requires-Dist: pillow
|
27
27
|
Requires-Dist: pyautogui
|
28
|
+
Requires-Dist: requests
|
28
29
|
Dynamic: author
|
29
30
|
Dynamic: author-email
|
30
31
|
Dynamic: classifier
|
@@ -54,13 +55,16 @@ Dynamic: summary
|
|
54
55
|
|
55
56
|
## Sumário do conteudo
|
56
57
|
|
58
|
+
- [O que é?](#o-que-é)
|
59
|
+
- [Sumário do conteudo](#sumário-do-conteudo)
|
57
60
|
- [Destaque](#destaque)
|
58
61
|
- [Objetivo](#objetivo)
|
59
62
|
- [Instalação](#instalação)
|
60
63
|
- [Exemplo](#exemplo)
|
61
64
|
- [Dependências](#dependências)
|
62
65
|
- [Estrutura do módulo](#estrutura-do-módulo)
|
63
|
-
- [
|
66
|
+
- [Release](#release)
|
67
|
+
- [Notas da atualização: 1.4.6](#notas-da-atualização-146)
|
64
68
|
- [Mais Sobre](#mais-sobre)
|
65
69
|
|
66
70
|
## Destaque
|
@@ -94,17 +98,17 @@ ou no conda:
|
|
94
98
|
conda install -c conda-forge rpa-suite
|
95
99
|
```
|
96
100
|
|
97
|
-
Após instalação basta fazer a importação do modulo
|
101
|
+
Após instalação basta fazer a importação do modulo rpa que ja tera um objeto instanciado de ``suite``:
|
98
102
|
|
99
103
|
```python
|
100
|
-
from rpa_suite import
|
104
|
+
from rpa_suite import rpa
|
101
105
|
```
|
102
106
|
|
103
107
|
Feito isso já estará pronto para o uso:
|
104
108
|
|
105
109
|
```python
|
106
110
|
# function send mail by SMTP
|
107
|
-
rpa.send_mail(...)
|
111
|
+
rpa.email.send_mail(...)
|
108
112
|
```
|
109
113
|
|
110
114
|
> [!NOTE]
|
@@ -121,21 +125,24 @@ rpa.send_mail(...)
|
|
121
125
|
> Opcionalmente você pode querer desinstalar as libs que foram inclusas no projeto, sendo assim:
|
122
126
|
|
123
127
|
```python
|
124
|
-
>>> python -m pip uninstall loguru mail_validator colorama
|
128
|
+
>>> python -m pip uninstall loguru mail_validator colorama pillow pyautogui
|
125
129
|
```
|
126
130
|
|
127
131
|
## Exemplo
|
128
132
|
|
129
133
|
Do módulo principal, importe a suite. Ela retorna uma instância do Objeto de classe Rpa_suite, onde possui variáveis apontando para todas funções dos submódulos:
|
130
134
|
|
131
|
-
from rpa_suite import
|
135
|
+
from rpa_suite import rpa
|
132
136
|
|
133
|
-
#
|
134
|
-
rpa.
|
137
|
+
# Exemplo com função de execução em horario especifico
|
138
|
+
rpa.clock.exec_at_hour('13:53', my_function, param_a, param_b)
|
135
139
|
|
136
|
-
# Usando submódulo clock para aguardar 30
|
140
|
+
# Usando submódulo clock para aguardar 30(seg) para executar minha função
|
137
141
|
time = 30
|
138
|
-
rpa.wait_for_exec(time, my_function, param1, param2)
|
142
|
+
rpa.clock.wait_for_exec(time, my_function, param1, param2)
|
143
|
+
|
144
|
+
# Usando submódulo email para envio de email por smtp comum
|
145
|
+
rpa.email.send_smtp(...)
|
139
146
|
|
140
147
|
## Dependências
|
141
148
|
|
@@ -159,44 +166,61 @@ No caso da função de screenshot é necessario ter as libs 'pyautogui' 'pillow'
|
|
159
166
|
|
160
167
|
## Estrutura do módulo
|
161
168
|
|
162
|
-
O módulo principal do rpa-suite é dividido em categorias. Cada categoria contém módulos com funções destinadas a
|
163
|
-
|
164
|
-
! Divisao e nomes de funções precisam ser atualizadas nesta sessão de Estrutura do módulo !
|
169
|
+
O módulo principal do rpa-suite é dividido em categorias. Cada categoria contém módulos com funções destinadas a categoria:
|
165
170
|
|
166
171
|
- **rpa_suite**
|
167
172
|
- **clock**
|
168
|
-
- **
|
169
|
-
- **
|
173
|
+
- **exec_at_hour** - Função que executa uma função no horário especificado "xx:yy", permitindo agendamento de tarefas com precisão.
|
174
|
+
- **wait_for_exec** - Função que aguarda um tempo em segundos antes de executar a função passada como argumento.
|
175
|
+
- **exec_and_wait** - Função que executa uma função e, em seguida, aguarda um tempo em segundos antes de continuar.
|
170
176
|
- **date**
|
171
|
-
- **
|
177
|
+
- **get_hms** - Função que retorna hora, minuto e segundo formatados como strings.
|
178
|
+
- **get_dmy** - Função que retorna dia, mês e ano formatados como strings.
|
172
179
|
- **email**
|
173
|
-
- **
|
180
|
+
- **send_smtp** - Função para envio de emails via SMTP com suporte a anexos e mensagens HTML, configurável e personalizável.
|
174
181
|
- **file**
|
175
|
-
- **
|
176
|
-
- **
|
177
|
-
- **
|
178
|
-
- **
|
182
|
+
- **screen_shot** - Função para capturar screenshots, criando diretórios e arquivos com nomes e caminhos personalizáveis.
|
183
|
+
- **flag_create** - Função para criar arquivos de flag indicando execução de processos.
|
184
|
+
- **flag_delete** - Função para deletar arquivos de flag após a execução de processos.
|
185
|
+
- **count_files** - Função para contar arquivos em diretórios, com suporte a extensões específicas.
|
186
|
+
- **directory**
|
187
|
+
- **create_temp_dir** - Função para criar diretórios temporários com nomes e caminhos personalizáveis.
|
188
|
+
- **delete_temp_dir** - Função para deletar diretórios temporários, com opção de remover arquivos contidos.
|
179
189
|
- **log**
|
180
|
-
- **
|
181
|
-
- **
|
182
|
-
- **
|
190
|
+
- **config_logger** - Função para configurar logs com suporte a arquivos e streams, utilizando a biblioteca Loguru.
|
191
|
+
- **log_start_run_debug** - Função para registrar logs de início de execução em nível de depuração.
|
192
|
+
- **log_debug** - Função para registrar logs em nível de depuração.
|
193
|
+
- **log_info** - Função para registrar logs em nível informativo.
|
194
|
+
- **log_warning** - Função para registrar logs em nível de aviso.
|
195
|
+
- **log_error** - Função para registrar logs em nível de erro.
|
196
|
+
- **log_critical** - Função para registrar logs em nível crítico.
|
197
|
+
- **printer**
|
198
|
+
- **success_print** - Função para imprimir mensagens de sucesso com destaque em verde.
|
199
|
+
- **alert_print** - Função para imprimir mensagens de alerta com destaque em amarelo.
|
200
|
+
- **info_print** - Função para imprimir mensagens informativas com destaque em ciano.
|
201
|
+
- **error_print** - Função para imprimir mensagens de erro com destaque em vermelho.
|
183
202
|
- **regex**
|
184
|
-
- **
|
203
|
+
- **check_pattern_in_text** - Função para verificar a presença de padrões em textos, com suporte a case-sensitive.
|
185
204
|
- **validate**
|
186
|
-
- **
|
187
|
-
- **
|
205
|
+
- **emails** - Função para validar listas de emails, retornando listas de emails válidos e inválidos.
|
206
|
+
- **word** - Função para buscar palavras ou padrões específicos em textos, com suporte a contagem de ocorrências.
|
207
|
+
- **browser**
|
208
|
+
- **start_browser** - Função para iniciar o navegador Chrome com suporte a depuração remota.
|
209
|
+
- **find_ele** - Função para localizar elementos na página utilizando estratégias de localização do Selenium.
|
210
|
+
- **get** - Função para navegar para URLs específicas.
|
211
|
+
- **close_browser** - Função para fechar o navegador e encerrar processos relacionados.
|
188
212
|
|
189
213
|
## Release
|
190
214
|
|
191
|
-
Versão: **Beta 1.4.
|
215
|
+
Versão: **Beta 1.4.6**
|
192
216
|
|
193
217
|
Lançamento: *20/02/2024*
|
194
218
|
|
195
|
-
Última atualização: *
|
219
|
+
Última atualização: *12/04/2025*
|
196
220
|
|
197
221
|
Status: Em desenvolvimento.
|
198
222
|
|
199
|
-
### Notas da atualização: 1.4.
|
223
|
+
### Notas da atualização: 1.4.6
|
200
224
|
|
201
225
|
- Mudança dos submodulos para Objetos, agora Rpa_suite é um Objeto de Suite que compoe diversos sub-objetos separados pelas mesmas categorias anteriormente ja definidas
|
202
226
|
- Reformulada a arquitetura do projeto para melhor coeção e menos subpastas e arquivos, agora a estrutura é mais simples e de melhor manutenção contendo apenas uma pasta core para o nucleo de nossos modulos, e uma pasta utils com ferramentas utilitarias que vamos adicionar varias novidades
|
@@ -212,13 +236,9 @@ Status: Em desenvolvimento.
|
|
212
236
|
## Mais Sobre
|
213
237
|
|
214
238
|
Para mais informações, visite nosso projeto no Github ou PyPi:
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
`<br>`
|
220
|
-
`<a href='https://pypi.org/project/rpa-suite/' target='_blank'>`
|
221
|
-
Ver projeto publicado no PyPI.
|
222
|
-
`</a>`
|
239
|
+
|
240
|
+
[Ver no GitHub](https://github.com/CamiloCCarvalho/rpa_suite)
|
241
|
+
|
242
|
+
[Ver projeto publicado no PyPI](https://pypi.org/project/rpa-suite/)
|
223
243
|
|
224
244
|
<hr>
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
2
2
|
|
3
3
|
setup(
|
4
4
|
name='rpa_suite',
|
5
|
-
version='1.4.
|
5
|
+
version='1.4.6',
|
6
6
|
packages=find_packages(),
|
7
7
|
description='Conjunto de ferramentas essenciais para Automação RPA com Python, que facilitam o dia a dia de desenvolvimento.',
|
8
8
|
long_description_content_type='text/markdown',
|
@@ -23,5 +23,5 @@ setup(
|
|
23
23
|
'Topic :: Software Development :: Libraries :: Python Modules'
|
24
24
|
],
|
25
25
|
keywords='basic-tools, email-tools, email-validation, file-tools, simple-functions, rpa-tools, rpa-functions, Tools, Rpa, Automation, RPA, Automação, Python, Ferramentas de RPA, Automação de Processos, Biblioteca Python para RPA, Bot, Robô, Ferramentas de automação',
|
26
|
-
install_requires=['colorama', 'colorlog', 'email_validator', 'loguru', 'typing', 'pillow', 'pyautogui'],
|
26
|
+
install_requires=['colorama', 'colorlog', 'email_validator', 'loguru', 'typing', 'pillow', 'pyautogui', 'requests'],
|
27
27
|
)
|
@@ -1,166 +0,0 @@
|
|
1
|
-
# default import
|
2
|
-
import os, requests
|
3
|
-
|
4
|
-
# imports
|
5
|
-
from rpa_suite.functions._printer import error_print, alert_print, success_print
|
6
|
-
|
7
|
-
from selenium import webdriver
|
8
|
-
from selenium.webdriver.common.by import By
|
9
|
-
from selenium.webdriver.chrome.options import Options
|
10
|
-
from selenium.webdriver.support.ui import WebDriverWait
|
11
|
-
from selenium.webdriver.support import expected_conditions as EC
|
12
|
-
from webdriver_manager.chrome import ChromeDriverManager
|
13
|
-
from time import sleep
|
14
|
-
|
15
|
-
class Browser():
|
16
|
-
|
17
|
-
"""
|
18
|
-
WIP ...
|
19
|
-
"""
|
20
|
-
|
21
|
-
driver: None
|
22
|
-
port: int = None
|
23
|
-
path_driver = None
|
24
|
-
|
25
|
-
def __init__(self, port: int = 9393, close_all_chrome_on_this_port: bool = True):
|
26
|
-
self.port = port
|
27
|
-
self.path_driver = ChromeDriverManager().install()
|
28
|
-
|
29
|
-
if close_all_chrome_on_this_port: self._close_all_chrome()
|
30
|
-
...
|
31
|
-
|
32
|
-
def configure_browser(self) -> None:
|
33
|
-
|
34
|
-
try:
|
35
|
-
# Use the absolute path from comment
|
36
|
-
|
37
|
-
options = Options()
|
38
|
-
options.add_experimental_option("debuggerAddress",
|
39
|
-
f"127.0.0.1:{str(self.port)}")
|
40
|
-
|
41
|
-
# Additional configs
|
42
|
-
options.add_argument("--start-maximized")
|
43
|
-
options.add_argument("--disable-notifications")
|
44
|
-
|
45
|
-
# Verifica se o caminho do driver está correto
|
46
|
-
if not os.path.exists(self.path_driver):
|
47
|
-
raise FileNotFoundError(f'O caminho do driver não foi encontrado: {self.path_driver}')
|
48
|
-
|
49
|
-
# Create driver with options and chromedriver path
|
50
|
-
self.driver = webdriver.Chrome(
|
51
|
-
#service=self.path_driver,
|
52
|
-
options=options,
|
53
|
-
keep_alive=True
|
54
|
-
)
|
55
|
-
|
56
|
-
except Exception as e:
|
57
|
-
error_print(f'Erro durante a função: {self.configure_browser.__name__}! Error: {str(e)}.')
|
58
|
-
|
59
|
-
def start_browser(self, close_chrome_on_this_port: bool = True, display_message: bool = False):
|
60
|
-
|
61
|
-
try:
|
62
|
-
if close_chrome_on_this_port: self.close_browser()
|
63
|
-
|
64
|
-
# Inicia o Chrome com debugging port
|
65
|
-
os.system(f'start chrome.exe --remote-debugging-port={str(self.port)} --user-data-dir="C:/temp/chrome_profile"')
|
66
|
-
|
67
|
-
# Aguardar até que o Chrome esteja realmente aberto
|
68
|
-
while True:
|
69
|
-
try:
|
70
|
-
# Tenta conectar ao Chrome na porta de depuração
|
71
|
-
response = requests.get(f'http://127.0.0.1:{self.port}/json')
|
72
|
-
if response.status_code == 200:
|
73
|
-
break # O Chrome está aberto
|
74
|
-
except requests.ConnectionError:
|
75
|
-
sleep(1) # Espera um segundo antes de tentar novamente
|
76
|
-
|
77
|
-
# Inicializa o Chrome com as opções
|
78
|
-
self.configure_browser()
|
79
|
-
|
80
|
-
if display_message: success_print(f'Browser: Iniciado com sucesso!')
|
81
|
-
|
82
|
-
except Exception as e:
|
83
|
-
error_print(f'Erro ao iniciar navegador: {str(e)}.')
|
84
|
-
|
85
|
-
|
86
|
-
def find_ele(self, value, by=By.XPATH, timeout=12, display_message=True):
|
87
|
-
|
88
|
-
try:
|
89
|
-
sleep(2)
|
90
|
-
element = WebDriverWait(self.driver, timeout).until(
|
91
|
-
EC.presence_of_element_located((by, value))
|
92
|
-
); return element
|
93
|
-
|
94
|
-
except Exception as e:
|
95
|
-
|
96
|
-
if display_message:
|
97
|
-
error_print(f'Erro durante a função: {self.find_ele.__name__}! Error: {str(e)}.')
|
98
|
-
return None
|
99
|
-
else: return None
|
100
|
-
|
101
|
-
# find elements (needs implementation)
|
102
|
-
...
|
103
|
-
|
104
|
-
# navigate
|
105
|
-
def get(self, url: str, display_message: bool = False):
|
106
|
-
|
107
|
-
try:
|
108
|
-
self.driver.get(url)
|
109
|
-
if display_message: success_print(f'Browser: Navegando para: {url}')
|
110
|
-
|
111
|
-
except Exception as e:
|
112
|
-
error_print(f'Erro ao navegar para a URL: {url}. Error: {str(e)}.')
|
113
|
-
|
114
|
-
|
115
|
-
def _close_all_chrome(self):
|
116
|
-
|
117
|
-
try:
|
118
|
-
os.system('taskkill /F /IM chrome.exe >nul 2>&1')
|
119
|
-
except:
|
120
|
-
pass
|
121
|
-
|
122
|
-
|
123
|
-
def close_browser(self, display_message: bool = False):
|
124
|
-
|
125
|
-
try:
|
126
|
-
# Primeiro tenta fechar todas as janelas via Selenium
|
127
|
-
try:
|
128
|
-
self.driver.close()
|
129
|
-
except:
|
130
|
-
pass
|
131
|
-
|
132
|
-
# Depois tenta encerrar a sessão
|
133
|
-
try:
|
134
|
-
self.driver.quit()
|
135
|
-
except:
|
136
|
-
pass
|
137
|
-
|
138
|
-
# Aguarda um momento para o processo ser liberado
|
139
|
-
sleep(1)
|
140
|
-
|
141
|
-
# Força o fechamento do processo específico do Chrome
|
142
|
-
os.system(f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" >nul 2>&1')
|
143
|
-
|
144
|
-
# Verifica se o processo foi realmente terminado
|
145
|
-
check = os.system(f'tasklist /fi "imagename eq chrome.exe" /fi "commandline like *--remote-debugging-port={str(self.port)}*" >nul 2>&1')
|
146
|
-
|
147
|
-
if check == 0:
|
148
|
-
# Processo ainda existe, tenta método mais agressivo
|
149
|
-
os.system(f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" /t >nul 2>&1')
|
150
|
-
if display_message: alert_print(f'Browser: Fechado via força!')
|
151
|
-
|
152
|
-
else:
|
153
|
-
if display_message: success_print(f'Browser: Fechado com sucesso!')
|
154
|
-
|
155
|
-
except Exception as e:
|
156
|
-
|
157
|
-
|
158
|
-
try:
|
159
|
-
if display_message: alert_print(f'Erro ao fechar navegador: {str(e)}, Tentando meio mais forte!')
|
160
|
-
|
161
|
-
# Último recurso - mata todos os processos do Chrome (use com cautela)
|
162
|
-
os.system(f'taskkill /f /im chrome.exe /fi "commandline like *--remote-debugging-port={str(self.port)}*" /t >nul 2>&1')
|
163
|
-
if display_message: alert_print(f'Browser: Fechado via força extrema!')
|
164
|
-
|
165
|
-
except Exception as error_ultimate:
|
166
|
-
if display_message: error_print(f'Falha crítica ao tentar fechar o navegador! Error: {str(error_ultimate)}!')
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|