Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -1307,7 +1307,6 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1307 |
|
| 1308 |
driver = session["driver"]
|
| 1309 |
|
| 1310 |
-
# Recuperar janela ativa
|
| 1311 |
try:
|
| 1312 |
handles = driver.window_handles
|
| 1313 |
if handles:
|
|
@@ -1315,11 +1314,9 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1315 |
except Exception:
|
| 1316 |
pass
|
| 1317 |
|
| 1318 |
-
# Obter tamanho real da viewport
|
| 1319 |
viewport_width = driver.execute_script("return window.innerWidth;")
|
| 1320 |
viewport_height = driver.execute_script("return window.innerHeight;")
|
| 1321 |
|
| 1322 |
-
# Escalar coordenadas
|
| 1323 |
actual_x = int(x * viewport_width / img_width) if img_width > 0 else int(x)
|
| 1324 |
actual_y = int(y * viewport_height / img_height) if img_height > 0 else int(y)
|
| 1325 |
actual_x = max(0, min(actual_x, viewport_width - 1))
|
|
@@ -1327,14 +1324,14 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1327 |
|
| 1328 |
logger.info(f"Click: preview({x},{y}) img({img_width}x{img_height}) -> real({actual_x},{actual_y}) viewport({viewport_width}x{viewport_height})")
|
| 1329 |
|
| 1330 |
-
# Guardar URL antes do clique
|
| 1331 |
original_url = driver.current_url
|
| 1332 |
|
| 1333 |
-
# Detectar elemento
|
| 1334 |
element_info = driver.execute_script(f"""
|
| 1335 |
var elem = document.elementFromPoint({actual_x}, {actual_y});
|
|
|
|
| 1336 |
if (elem) {{
|
| 1337 |
-
|
| 1338 |
tagName: elem.tagName || '',
|
| 1339 |
id: elem.id || '',
|
| 1340 |
text: (elem.textContent || '').substring(0, 100).trim(),
|
|
@@ -1342,16 +1339,23 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1342 |
href: elem.href || '',
|
| 1343 |
className: (elem.className || '').substring(0, 100)
|
| 1344 |
}};
|
| 1345 |
-
|
| 1346 |
-
|
| 1347 |
-
|
| 1348 |
-
|
| 1349 |
-
|
| 1350 |
-
|
| 1351 |
-
|
| 1352 |
-
|
| 1353 |
-
|
| 1354 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1355 |
}} else {{
|
| 1356 |
var evt = new MouseEvent('click', {{
|
| 1357 |
bubbles: true, cancelable: true,
|
|
@@ -1359,9 +1363,9 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1359 |
}});
|
| 1360 |
document.body.dispatchEvent(evt);
|
| 1361 |
}}
|
|
|
|
| 1362 |
""")
|
| 1363 |
|
| 1364 |
-
# Esperar navegacao com timeout curto
|
| 1365 |
import time
|
| 1366 |
max_wait = 8
|
| 1367 |
waited = 0
|
|
@@ -1369,11 +1373,9 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1369 |
time.sleep(0.5)
|
| 1370 |
waited += 0.5
|
| 1371 |
try:
|
| 1372 |
-
# Verificar se mudou de janela
|
| 1373 |
handles = driver.window_handles
|
| 1374 |
if handles:
|
| 1375 |
driver.switch_to.window(handles[-1])
|
| 1376 |
-
# Verificar se pagina carregou
|
| 1377 |
ready = driver.execute_script("return document.readyState;")
|
| 1378 |
if ready == "complete":
|
| 1379 |
break
|
|
@@ -1388,12 +1390,10 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1388 |
pass
|
| 1389 |
break
|
| 1390 |
|
| 1391 |
-
# Screenshot
|
| 1392 |
screenshot = None
|
| 1393 |
try:
|
| 1394 |
screenshot = driver.get_screenshot_as_base64()
|
| 1395 |
-
except Exception
|
| 1396 |
-
logger.warning(f"Screenshot falhou apos clique: {e}")
|
| 1397 |
try:
|
| 1398 |
handles = driver.window_handles
|
| 1399 |
if handles:
|
|
@@ -1413,34 +1413,26 @@ async def click_element(request: dict, token: str = Depends(verify_token)):
|
|
| 1413 |
session["last_url"] = current_url
|
| 1414 |
session["last_activity"] = time.time()
|
| 1415 |
|
| 1416 |
-
url_changed = current_url != original_url
|
| 1417 |
-
|
| 1418 |
return {
|
| 1419 |
"success": True,
|
| 1420 |
-
"message": f"Clique em ({actual_x}, {actual_y})",
|
| 1421 |
"clicked": element_info,
|
| 1422 |
-
"element": f"{element_info.get('tagName', '')}: {element_info.get('text', '')}" if element_info else "Nenhum elemento",
|
| 1423 |
"url": current_url,
|
| 1424 |
"current_url": current_url,
|
| 1425 |
"title": title,
|
| 1426 |
"screenshot": screenshot,
|
| 1427 |
-
"url_changed":
|
| 1428 |
}
|
| 1429 |
|
| 1430 |
except HTTPException:
|
| 1431 |
raise
|
| 1432 |
except Exception as e:
|
| 1433 |
logger.error(f"Erro no clique: {e}")
|
| 1434 |
-
# Tentar screenshot mesmo com erro
|
| 1435 |
screenshot = None
|
| 1436 |
try:
|
| 1437 |
-
|
| 1438 |
-
if
|
| 1439 |
-
|
| 1440 |
-
handles = d.window_handles
|
| 1441 |
-
if handles:
|
| 1442 |
-
d.switch_to.window(handles[-1])
|
| 1443 |
-
screenshot = d.get_screenshot_as_base64()
|
| 1444 |
except Exception:
|
| 1445 |
pass
|
| 1446 |
return {"success": False, "message": str(e), "screenshot": screenshot}
|
|
|
|
| 1307 |
|
| 1308 |
driver = session["driver"]
|
| 1309 |
|
|
|
|
| 1310 |
try:
|
| 1311 |
handles = driver.window_handles
|
| 1312 |
if handles:
|
|
|
|
| 1314 |
except Exception:
|
| 1315 |
pass
|
| 1316 |
|
|
|
|
| 1317 |
viewport_width = driver.execute_script("return window.innerWidth;")
|
| 1318 |
viewport_height = driver.execute_script("return window.innerHeight;")
|
| 1319 |
|
|
|
|
| 1320 |
actual_x = int(x * viewport_width / img_width) if img_width > 0 else int(x)
|
| 1321 |
actual_y = int(y * viewport_height / img_height) if img_height > 0 else int(y)
|
| 1322 |
actual_x = max(0, min(actual_x, viewport_width - 1))
|
|
|
|
| 1324 |
|
| 1325 |
logger.info(f"Click: preview({x},{y}) img({img_width}x{img_height}) -> real({actual_x},{actual_y}) viewport({viewport_width}x{viewport_height})")
|
| 1326 |
|
|
|
|
| 1327 |
original_url = driver.current_url
|
| 1328 |
|
| 1329 |
+
# Detectar elemento + clicar + focar via JavaScript
|
| 1330 |
element_info = driver.execute_script(f"""
|
| 1331 |
var elem = document.elementFromPoint({actual_x}, {actual_y});
|
| 1332 |
+
var info = null;
|
| 1333 |
if (elem) {{
|
| 1334 |
+
info = {{
|
| 1335 |
tagName: elem.tagName || '',
|
| 1336 |
id: elem.id || '',
|
| 1337 |
text: (elem.textContent || '').substring(0, 100).trim(),
|
|
|
|
| 1339 |
href: elem.href || '',
|
| 1340 |
className: (elem.className || '').substring(0, 100)
|
| 1341 |
}};
|
| 1342 |
+
// FOCAR no elemento primeiro (essencial para inputs)
|
| 1343 |
+
elem.focus();
|
| 1344 |
+
// Disparar eventos de mouse completos
|
| 1345 |
+
['mousedown', 'mouseup', 'click'].forEach(function(evtType) {{
|
| 1346 |
+
var evt = new MouseEvent(evtType, {{
|
| 1347 |
+
bubbles: true, cancelable: true,
|
| 1348 |
+
clientX: {actual_x}, clientY: {actual_y}, view: window
|
| 1349 |
+
}});
|
| 1350 |
+
elem.dispatchEvent(evt);
|
| 1351 |
+
}});
|
| 1352 |
+
// Se for input/textarea, colocar cursor no final
|
| 1353 |
+
if (elem.tagName === 'INPUT' || elem.tagName === 'TEXTAREA') {{
|
| 1354 |
+
elem.focus();
|
| 1355 |
+
if (elem.value) {{
|
| 1356 |
+
elem.setSelectionRange(elem.value.length, elem.value.length);
|
| 1357 |
+
}}
|
| 1358 |
+
}}
|
| 1359 |
}} else {{
|
| 1360 |
var evt = new MouseEvent('click', {{
|
| 1361 |
bubbles: true, cancelable: true,
|
|
|
|
| 1363 |
}});
|
| 1364 |
document.body.dispatchEvent(evt);
|
| 1365 |
}}
|
| 1366 |
+
return info;
|
| 1367 |
""")
|
| 1368 |
|
|
|
|
| 1369 |
import time
|
| 1370 |
max_wait = 8
|
| 1371 |
waited = 0
|
|
|
|
| 1373 |
time.sleep(0.5)
|
| 1374 |
waited += 0.5
|
| 1375 |
try:
|
|
|
|
| 1376 |
handles = driver.window_handles
|
| 1377 |
if handles:
|
| 1378 |
driver.switch_to.window(handles[-1])
|
|
|
|
| 1379 |
ready = driver.execute_script("return document.readyState;")
|
| 1380 |
if ready == "complete":
|
| 1381 |
break
|
|
|
|
| 1390 |
pass
|
| 1391 |
break
|
| 1392 |
|
|
|
|
| 1393 |
screenshot = None
|
| 1394 |
try:
|
| 1395 |
screenshot = driver.get_screenshot_as_base64()
|
| 1396 |
+
except Exception:
|
|
|
|
| 1397 |
try:
|
| 1398 |
handles = driver.window_handles
|
| 1399 |
if handles:
|
|
|
|
| 1413 |
session["last_url"] = current_url
|
| 1414 |
session["last_activity"] = time.time()
|
| 1415 |
|
|
|
|
|
|
|
| 1416 |
return {
|
| 1417 |
"success": True,
|
|
|
|
| 1418 |
"clicked": element_info,
|
| 1419 |
+
"element": f"{element_info.get('tagName', '')}: \"{element_info.get('text', '')}\"" if element_info else "Nenhum elemento",
|
| 1420 |
"url": current_url,
|
| 1421 |
"current_url": current_url,
|
| 1422 |
"title": title,
|
| 1423 |
"screenshot": screenshot,
|
| 1424 |
+
"url_changed": current_url != original_url
|
| 1425 |
}
|
| 1426 |
|
| 1427 |
except HTTPException:
|
| 1428 |
raise
|
| 1429 |
except Exception as e:
|
| 1430 |
logger.error(f"Erro no clique: {e}")
|
|
|
|
| 1431 |
screenshot = None
|
| 1432 |
try:
|
| 1433 |
+
s = session_manager.get_session(request.get("session_id", ""))
|
| 1434 |
+
if s:
|
| 1435 |
+
screenshot = s["driver"].get_screenshot_as_base64()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1436 |
except Exception:
|
| 1437 |
pass
|
| 1438 |
return {"success": False, "message": str(e), "screenshot": screenshot}
|