onerom-desktop 1.0.0__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.
- onerom_desktop-1.0.0/.gitignore +50 -0
- onerom_desktop-1.0.0/LICENSE +21 -0
- onerom_desktop-1.0.0/PKG-INFO +178 -0
- onerom_desktop-1.0.0/README.md +131 -0
- onerom_desktop-1.0.0/onerom_desktop/__init__.py +86 -0
- onerom_desktop-1.0.0/onerom_desktop/app.py +366 -0
- onerom_desktop-1.0.0/onerom_desktop/dpi.py +52 -0
- onerom_desktop-1.0.0/onerom_desktop/engines/__init__.py +13 -0
- onerom_desktop-1.0.0/onerom_desktop/engines/ocr.py +197 -0
- onerom_desktop-1.0.0/onerom_desktop/engines/sap.py +272 -0
- onerom_desktop-1.0.0/onerom_desktop/engines/template.py +230 -0
- onerom_desktop-1.0.0/onerom_desktop/engines/uia.py +273 -0
- onerom_desktop-1.0.0/onerom_desktop/engines/windows.py +144 -0
- onerom_desktop-1.0.0/onerom_desktop/errors.py +140 -0
- onerom_desktop-1.0.0/onerom_desktop/geometry.py +47 -0
- onerom_desktop-1.0.0/onerom_desktop/keyboard.py +86 -0
- onerom_desktop-1.0.0/onerom_desktop/locators.py +281 -0
- onerom_desktop-1.0.0/onerom_desktop/optional.py +70 -0
- onerom_desktop-1.0.0/onerom_desktop/pointer.py +63 -0
- onerom_desktop-1.0.0/onerom_desktop/screen.py +91 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/__init__.py +94 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/backend.py +81 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/base.py +151 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/coordinate.py +90 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/image.py +37 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/ocr.py +63 -0
- onerom_desktop-1.0.0/onerom_desktop/strategies/sap.py +89 -0
- onerom_desktop-1.0.0/pyproject.toml +110 -0
- onerom_desktop-1.0.0/tests/test_app.py +226 -0
- onerom_desktop-1.0.0/tests/test_backend.py +310 -0
- onerom_desktop-1.0.0/tests/test_engines.py +155 -0
- onerom_desktop-1.0.0/tests/test_locators.py +131 -0
- onerom_desktop-1.0.0/tests/test_sap.py +223 -0
- onerom_desktop-1.0.0/tests/test_strategies.py +164 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Local Netlify folder
|
|
2
|
+
.netlify
|
|
3
|
+
|
|
4
|
+
# Binarios e artefatos de build
|
|
5
|
+
*.exe
|
|
6
|
+
*.pkg
|
|
7
|
+
*.pyz
|
|
8
|
+
*.zip
|
|
9
|
+
*.tar
|
|
10
|
+
*.tar.gz
|
|
11
|
+
*.toc
|
|
12
|
+
*.html
|
|
13
|
+
*.txt
|
|
14
|
+
|
|
15
|
+
# Diretorios de build do PyInstaller
|
|
16
|
+
runner/build/
|
|
17
|
+
runner/dist/
|
|
18
|
+
runner/installer/build/
|
|
19
|
+
runner/installer/dist/
|
|
20
|
+
|
|
21
|
+
# Artefatos de deploy
|
|
22
|
+
rebuild/backend/dist/
|
|
23
|
+
rebuild/frontend/dist/
|
|
24
|
+
|
|
25
|
+
# Execucoes locais do runner
|
|
26
|
+
runner/executions/
|
|
27
|
+
|
|
28
|
+
# Dependencias Python
|
|
29
|
+
**/__pycache__/
|
|
30
|
+
**/.venv/
|
|
31
|
+
*.pyc
|
|
32
|
+
*.pyo
|
|
33
|
+
|
|
34
|
+
# Node
|
|
35
|
+
frontend/node_modules/
|
|
36
|
+
|
|
37
|
+
# Env local do monorepo / compose
|
|
38
|
+
.env
|
|
39
|
+
.env.*.local
|
|
40
|
+
|
|
41
|
+
# Deploy images (apenas o deploy/ da RAIZ; nao os deploy/ de subprojetos)
|
|
42
|
+
/deploy/
|
|
43
|
+
deployimages*
|
|
44
|
+
|
|
45
|
+
# Scripts venv
|
|
46
|
+
scripts/.venv/
|
|
47
|
+
|
|
48
|
+
# Distribuicoes de pacotes
|
|
49
|
+
onerom_core/dist/
|
|
50
|
+
.DS_Store
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Onerom
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: onerom-desktop
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Runtime de automacao desktop da plataforma ONEROM (UIA, OCR, imagem, coordenadas e SAP GUI)
|
|
5
|
+
Project-URL: Homepage, https://onerom.dev.br
|
|
6
|
+
Author: ONEROM Team
|
|
7
|
+
License: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: automation,desktop,ocr,onerom,rpa,sap,uia
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Requires-Dist: mss>=9.0.0
|
|
22
|
+
Requires-Dist: pillow>=10.0.0
|
|
23
|
+
Requires-Dist: psutil>=5.9.0
|
|
24
|
+
Requires-Dist: pyautogui>=0.9.54
|
|
25
|
+
Requires-Dist: pyperclip>=1.9.0
|
|
26
|
+
Provides-Extra: all
|
|
27
|
+
Requires-Dist: comtypes>=1.4.16; (sys_platform == 'win32') and extra == 'all'
|
|
28
|
+
Requires-Dist: numpy>=1.24; extra == 'all'
|
|
29
|
+
Requires-Dist: opencv-python-headless<5,>=4.9.0; extra == 'all'
|
|
30
|
+
Requires-Dist: pytesseract>=0.3.10; extra == 'all'
|
|
31
|
+
Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'all'
|
|
32
|
+
Requires-Dist: pywinauto>=0.6.9; (sys_platform == 'win32') and extra == 'all'
|
|
33
|
+
Provides-Extra: backend
|
|
34
|
+
Requires-Dist: comtypes>=1.4.16; (sys_platform == 'win32') and extra == 'backend'
|
|
35
|
+
Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'backend'
|
|
36
|
+
Requires-Dist: pywinauto>=0.6.9; (sys_platform == 'win32') and extra == 'backend'
|
|
37
|
+
Provides-Extra: image
|
|
38
|
+
Requires-Dist: numpy>=1.24; extra == 'image'
|
|
39
|
+
Requires-Dist: opencv-python-headless<5,>=4.9.0; extra == 'image'
|
|
40
|
+
Provides-Extra: ocr
|
|
41
|
+
Requires-Dist: numpy>=1.24; extra == 'ocr'
|
|
42
|
+
Requires-Dist: opencv-python-headless<5,>=4.9.0; extra == 'ocr'
|
|
43
|
+
Requires-Dist: pytesseract>=0.3.10; extra == 'ocr'
|
|
44
|
+
Provides-Extra: sap
|
|
45
|
+
Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'sap'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# onerom-desktop
|
|
49
|
+
|
|
50
|
+
Runtime de automação desktop da plataforma ONEROM.
|
|
51
|
+
|
|
52
|
+
É a biblioteca que os bots gerados pelo **ONEROM Inspector** importam para clicar,
|
|
53
|
+
preencher e ler telas — de aplicações Windows nativas a SAP GUI, passando por
|
|
54
|
+
janelas que não expõem nenhuma árvore de automação.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pip install "onerom-desktop[all]"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Uma classe, cinco estratégias
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from onerom_desktop import App
|
|
64
|
+
|
|
65
|
+
app = App(strategy="backend", automation_id="btnLogin", window_title="Login")
|
|
66
|
+
app.wait_visible()
|
|
67
|
+
app.click()
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
O que você passa no construtor vira padrão para todas as ações; o que passa na
|
|
71
|
+
ação vale só para aquela chamada. É isso que deixa o script curto sem esconder o
|
|
72
|
+
que ele está mirando.
|
|
73
|
+
|
|
74
|
+
| `strategy=` | Como localiza | Quando usar |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| `backend` | UIAutomation via pywinauto | **Padrão.** Sobrevive a janela movida, resolução diferente e troca de tema |
|
|
77
|
+
| `ocr` | Texto lido da tela (Tesseract) | Citrix, RDP, canvas Java/Delphi — quando não há árvore de automação |
|
|
78
|
+
| `image` | Template matching (OpenCV + ORB) | Ícones e controles desenhados, sem identidade nem rótulo |
|
|
79
|
+
| `coordinate` | Ponto fixo na tela | Último recurso: não verifica nada |
|
|
80
|
+
| `sap` | SAP GUI Scripting (COM) | Sempre, quando o alvo é SAP |
|
|
81
|
+
| `auto` | `backend` → `ocr` → `image` → `coordinate` | Degrada sozinho quando a aplicação muda |
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
app.fill(strategy="ocr", text="Usuário", value="admin")
|
|
85
|
+
app.click(strategy="image", image="botao.png", confidence=0.9)
|
|
86
|
+
app.press(strategy="sap", sap_id="wnd[0]/tbar[0]/btn[0]")
|
|
87
|
+
app.click(strategy="auto")
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Ações
|
|
91
|
+
|
|
92
|
+
`click` · `double_click` · `right_click` · `hover` · `fill` · `click_and_fill` ·
|
|
93
|
+
`type_text` · `get_text` · `wait_visible` · `exists` · `screenshot`
|
|
94
|
+
|
|
95
|
+
Para SAP, também: `find` · `set_text` · `press` · `submit`.
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
if app.exists(strategy="backend", automation_id="dlgErro", window_title="Erro"):
|
|
99
|
+
app.click(automation_id="btnFechar")
|
|
100
|
+
|
|
101
|
+
total = app.get_text(strategy="ocr", x=800, y=440, width=160, height=28)
|
|
102
|
+
app.screenshot("evidencia.png")
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Erros dizem o que fazer
|
|
106
|
+
|
|
107
|
+
Tudo herda de `OneromDesktopError`, e as classes existem para separar os três
|
|
108
|
+
casos que pedem tratamento diferente:
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
from onerom_desktop import (
|
|
112
|
+
OneromDesktopError, # base de tudo
|
|
113
|
+
DesktopLocatorError, # bug no bot — repetir não adianta
|
|
114
|
+
DesktopBackendUnavailableError, # ambiente quebrado — avisar o operador
|
|
115
|
+
ElementNotFoundError, # não achou agora — repetir pode funcionar
|
|
116
|
+
WaitTimeoutError,
|
|
117
|
+
MissingDependencyError, # traz o comando de instalação na mensagem
|
|
118
|
+
)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`exists()` responde `False` para ausência de verdade, mas **levanta** exceção
|
|
122
|
+
quando a verificação em si não pôde ser feita — dependência faltando, backend
|
|
123
|
+
indisponível, imagem de template ausente, SAP fechado. Responder `False` nesses
|
|
124
|
+
casos é como um bot acaba entrando no branch errado.
|
|
125
|
+
|
|
126
|
+
## Dependências opcionais
|
|
127
|
+
|
|
128
|
+
O `import onerom_desktop` é barato: OpenCV, Tesseract, pywinauto e pywin32 só
|
|
129
|
+
são carregados quando a estratégia correspondente é usada.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
pip install onerom-desktop # coordenadas, teclado, screenshot
|
|
133
|
+
pip install "onerom-desktop[backend]" # + UIAutomation (Windows)
|
|
134
|
+
pip install "onerom-desktop[image]" # + OpenCV
|
|
135
|
+
pip install "onerom-desktop[ocr]" # + Tesseract (o binário também é necessário)
|
|
136
|
+
pip install "onerom-desktop[sap]" # + SAP GUI Scripting (Windows)
|
|
137
|
+
pip install "onerom-desktop[all]" # tudo
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Faltando uma delas, a mensagem já traz o `pip install` certo em vez de um
|
|
141
|
+
`ModuleNotFoundError` cru no log do bot.
|
|
142
|
+
|
|
143
|
+
## Coordenadas são pixels FÍSICOS
|
|
144
|
+
|
|
145
|
+
Toda coordenada nesta biblioteca é pixel físico da mesa virtual (a união de
|
|
146
|
+
todos os monitores) — o mesmo espaço em que o Inspector captura, o `mss`
|
|
147
|
+
fotografa e o `pyautogui` clica.
|
|
148
|
+
|
|
149
|
+
O processo é marcado como *per-monitor DPI aware* no import. Sem isso, o Windows
|
|
150
|
+
reescala silenciosamente as coordenadas de um processo DPI-unaware e todo clique
|
|
151
|
+
erra o alvo em tela a 125%/150% — o clássico "funciona na minha tela".
|
|
152
|
+
|
|
153
|
+
## Arquitetura
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
onerom_desktop/
|
|
157
|
+
├── app.py App: defaults, dispatch e a cadeia auto
|
|
158
|
+
├── locators.py kwargs soltos -> locators validados
|
|
159
|
+
├── strategies/ interface uniforme de ações (base + 5 estratégias)
|
|
160
|
+
├── engines/ uia · ocr · template · sap · windows
|
|
161
|
+
├── pointer.py mouse screen.py captura de tela
|
|
162
|
+
├── keyboard.py texto geometry.py Region
|
|
163
|
+
├── errors.py hierarquia optional.py deps sob demanda
|
|
164
|
+
└── dpi.py invariante de pixel físico
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`strategies/base.py` concentra o caminho comum: as três estratégias que acabam
|
|
168
|
+
clicando um ponto (`ocr`, `image`, `coordinate`) só implementam `locate()` e
|
|
169
|
+
herdam todas as ações.
|
|
170
|
+
|
|
171
|
+
## Desenvolvimento
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
uv sync --group dev
|
|
175
|
+
./check.sh
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
MIT.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# onerom-desktop
|
|
2
|
+
|
|
3
|
+
Runtime de automação desktop da plataforma ONEROM.
|
|
4
|
+
|
|
5
|
+
É a biblioteca que os bots gerados pelo **ONEROM Inspector** importam para clicar,
|
|
6
|
+
preencher e ler telas — de aplicações Windows nativas a SAP GUI, passando por
|
|
7
|
+
janelas que não expõem nenhuma árvore de automação.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install "onerom-desktop[all]"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Uma classe, cinco estratégias
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
from onerom_desktop import App
|
|
17
|
+
|
|
18
|
+
app = App(strategy="backend", automation_id="btnLogin", window_title="Login")
|
|
19
|
+
app.wait_visible()
|
|
20
|
+
app.click()
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
O que você passa no construtor vira padrão para todas as ações; o que passa na
|
|
24
|
+
ação vale só para aquela chamada. É isso que deixa o script curto sem esconder o
|
|
25
|
+
que ele está mirando.
|
|
26
|
+
|
|
27
|
+
| `strategy=` | Como localiza | Quando usar |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| `backend` | UIAutomation via pywinauto | **Padrão.** Sobrevive a janela movida, resolução diferente e troca de tema |
|
|
30
|
+
| `ocr` | Texto lido da tela (Tesseract) | Citrix, RDP, canvas Java/Delphi — quando não há árvore de automação |
|
|
31
|
+
| `image` | Template matching (OpenCV + ORB) | Ícones e controles desenhados, sem identidade nem rótulo |
|
|
32
|
+
| `coordinate` | Ponto fixo na tela | Último recurso: não verifica nada |
|
|
33
|
+
| `sap` | SAP GUI Scripting (COM) | Sempre, quando o alvo é SAP |
|
|
34
|
+
| `auto` | `backend` → `ocr` → `image` → `coordinate` | Degrada sozinho quando a aplicação muda |
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
app.fill(strategy="ocr", text="Usuário", value="admin")
|
|
38
|
+
app.click(strategy="image", image="botao.png", confidence=0.9)
|
|
39
|
+
app.press(strategy="sap", sap_id="wnd[0]/tbar[0]/btn[0]")
|
|
40
|
+
app.click(strategy="auto")
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Ações
|
|
44
|
+
|
|
45
|
+
`click` · `double_click` · `right_click` · `hover` · `fill` · `click_and_fill` ·
|
|
46
|
+
`type_text` · `get_text` · `wait_visible` · `exists` · `screenshot`
|
|
47
|
+
|
|
48
|
+
Para SAP, também: `find` · `set_text` · `press` · `submit`.
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
if app.exists(strategy="backend", automation_id="dlgErro", window_title="Erro"):
|
|
52
|
+
app.click(automation_id="btnFechar")
|
|
53
|
+
|
|
54
|
+
total = app.get_text(strategy="ocr", x=800, y=440, width=160, height=28)
|
|
55
|
+
app.screenshot("evidencia.png")
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Erros dizem o que fazer
|
|
59
|
+
|
|
60
|
+
Tudo herda de `OneromDesktopError`, e as classes existem para separar os três
|
|
61
|
+
casos que pedem tratamento diferente:
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
from onerom_desktop import (
|
|
65
|
+
OneromDesktopError, # base de tudo
|
|
66
|
+
DesktopLocatorError, # bug no bot — repetir não adianta
|
|
67
|
+
DesktopBackendUnavailableError, # ambiente quebrado — avisar o operador
|
|
68
|
+
ElementNotFoundError, # não achou agora — repetir pode funcionar
|
|
69
|
+
WaitTimeoutError,
|
|
70
|
+
MissingDependencyError, # traz o comando de instalação na mensagem
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`exists()` responde `False` para ausência de verdade, mas **levanta** exceção
|
|
75
|
+
quando a verificação em si não pôde ser feita — dependência faltando, backend
|
|
76
|
+
indisponível, imagem de template ausente, SAP fechado. Responder `False` nesses
|
|
77
|
+
casos é como um bot acaba entrando no branch errado.
|
|
78
|
+
|
|
79
|
+
## Dependências opcionais
|
|
80
|
+
|
|
81
|
+
O `import onerom_desktop` é barato: OpenCV, Tesseract, pywinauto e pywin32 só
|
|
82
|
+
são carregados quando a estratégia correspondente é usada.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pip install onerom-desktop # coordenadas, teclado, screenshot
|
|
86
|
+
pip install "onerom-desktop[backend]" # + UIAutomation (Windows)
|
|
87
|
+
pip install "onerom-desktop[image]" # + OpenCV
|
|
88
|
+
pip install "onerom-desktop[ocr]" # + Tesseract (o binário também é necessário)
|
|
89
|
+
pip install "onerom-desktop[sap]" # + SAP GUI Scripting (Windows)
|
|
90
|
+
pip install "onerom-desktop[all]" # tudo
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Faltando uma delas, a mensagem já traz o `pip install` certo em vez de um
|
|
94
|
+
`ModuleNotFoundError` cru no log do bot.
|
|
95
|
+
|
|
96
|
+
## Coordenadas são pixels FÍSICOS
|
|
97
|
+
|
|
98
|
+
Toda coordenada nesta biblioteca é pixel físico da mesa virtual (a união de
|
|
99
|
+
todos os monitores) — o mesmo espaço em que o Inspector captura, o `mss`
|
|
100
|
+
fotografa e o `pyautogui` clica.
|
|
101
|
+
|
|
102
|
+
O processo é marcado como *per-monitor DPI aware* no import. Sem isso, o Windows
|
|
103
|
+
reescala silenciosamente as coordenadas de um processo DPI-unaware e todo clique
|
|
104
|
+
erra o alvo em tela a 125%/150% — o clássico "funciona na minha tela".
|
|
105
|
+
|
|
106
|
+
## Arquitetura
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
onerom_desktop/
|
|
110
|
+
├── app.py App: defaults, dispatch e a cadeia auto
|
|
111
|
+
├── locators.py kwargs soltos -> locators validados
|
|
112
|
+
├── strategies/ interface uniforme de ações (base + 5 estratégias)
|
|
113
|
+
├── engines/ uia · ocr · template · sap · windows
|
|
114
|
+
├── pointer.py mouse screen.py captura de tela
|
|
115
|
+
├── keyboard.py texto geometry.py Region
|
|
116
|
+
├── errors.py hierarquia optional.py deps sob demanda
|
|
117
|
+
└── dpi.py invariante de pixel físico
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
`strategies/base.py` concentra o caminho comum: as três estratégias que acabam
|
|
121
|
+
clicando um ponto (`ocr`, `image`, `coordinate`) só implementam `locate()` e
|
|
122
|
+
herdam todas as ações.
|
|
123
|
+
|
|
124
|
+
## Desenvolvimento
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
uv sync --group dev
|
|
128
|
+
./check.sh
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
MIT.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""onerom-desktop -- runtime de automacao desktop da plataforma ONEROM.
|
|
2
|
+
|
|
3
|
+
Uma classe, cinco estrategias:
|
|
4
|
+
|
|
5
|
+
from onerom_desktop import App
|
|
6
|
+
|
|
7
|
+
app = App(strategy="backend", automation_id="btnLogin", window_title="Login")
|
|
8
|
+
app.wait_visible()
|
|
9
|
+
app.click()
|
|
10
|
+
|
|
11
|
+
app.fill(strategy="ocr", text="Usuario", value="admin")
|
|
12
|
+
app.click(strategy="image", image="botao.png", confidence=0.9)
|
|
13
|
+
app.click(strategy="coordinate", x=500, y=300)
|
|
14
|
+
app.press(strategy="sap", sap_id="wnd[0]/tbar[0]/btn[0]")
|
|
15
|
+
app.click(strategy="auto") # backend -> ocr -> imagem -> coordenada
|
|
16
|
+
|
|
17
|
+
Todas as dependencias pesadas (OpenCV, Tesseract, pywinauto, pywin32) sao
|
|
18
|
+
opcionais e carregadas apenas quando a estrategia correspondente e usada --
|
|
19
|
+
instale com o extra que precisar: ``pip install "onerom-desktop[all]"``.
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from .app import App
|
|
24
|
+
from .dpi import set_process_dpi_aware
|
|
25
|
+
from .errors import (
|
|
26
|
+
AllStrategiesFailedError,
|
|
27
|
+
DesktopAutomationError,
|
|
28
|
+
DesktopBackendUnavailableError,
|
|
29
|
+
DesktopElementNotFoundError,
|
|
30
|
+
DesktopLocatorError,
|
|
31
|
+
ElementNotFoundError,
|
|
32
|
+
MissingDependencyError,
|
|
33
|
+
OneromDesktopError,
|
|
34
|
+
SAPAutomationError,
|
|
35
|
+
SAPConnectionError,
|
|
36
|
+
SAPGuiNotOpenError,
|
|
37
|
+
SAPLocatorError,
|
|
38
|
+
SAPScriptingUnavailableError,
|
|
39
|
+
SAPSessionUnavailableError,
|
|
40
|
+
StrategyError,
|
|
41
|
+
TemplateImageNotFoundError,
|
|
42
|
+
WaitTimeoutError,
|
|
43
|
+
)
|
|
44
|
+
from .geometry import Region
|
|
45
|
+
from .locators import (
|
|
46
|
+
STRATEGY_AUTO,
|
|
47
|
+
STRATEGY_BACKEND,
|
|
48
|
+
STRATEGY_COORDINATE,
|
|
49
|
+
STRATEGY_IMAGE,
|
|
50
|
+
STRATEGY_OCR,
|
|
51
|
+
STRATEGY_SAP,
|
|
52
|
+
)
|
|
53
|
+
from .strategies import available_strategies
|
|
54
|
+
|
|
55
|
+
__version__ = "1.0.0"
|
|
56
|
+
|
|
57
|
+
__all__ = [
|
|
58
|
+
"AllStrategiesFailedError",
|
|
59
|
+
"App",
|
|
60
|
+
"DesktopAutomationError",
|
|
61
|
+
"DesktopBackendUnavailableError",
|
|
62
|
+
"DesktopElementNotFoundError",
|
|
63
|
+
"DesktopLocatorError",
|
|
64
|
+
"ElementNotFoundError",
|
|
65
|
+
"MissingDependencyError",
|
|
66
|
+
"OneromDesktopError",
|
|
67
|
+
"Region",
|
|
68
|
+
"SAPAutomationError",
|
|
69
|
+
"SAPConnectionError",
|
|
70
|
+
"SAPGuiNotOpenError",
|
|
71
|
+
"SAPLocatorError",
|
|
72
|
+
"SAPScriptingUnavailableError",
|
|
73
|
+
"SAPSessionUnavailableError",
|
|
74
|
+
"STRATEGY_AUTO",
|
|
75
|
+
"STRATEGY_BACKEND",
|
|
76
|
+
"STRATEGY_COORDINATE",
|
|
77
|
+
"STRATEGY_IMAGE",
|
|
78
|
+
"STRATEGY_OCR",
|
|
79
|
+
"STRATEGY_SAP",
|
|
80
|
+
"StrategyError",
|
|
81
|
+
"TemplateImageNotFoundError",
|
|
82
|
+
"WaitTimeoutError",
|
|
83
|
+
"__version__",
|
|
84
|
+
"available_strategies",
|
|
85
|
+
"set_process_dpi_aware",
|
|
86
|
+
]
|