194 lines
9.0 KiB
Python
194 lines
9.0 KiB
Python
from selenium import webdriver
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
from selenium.webdriver.support.ui import Select
|
|
import time
|
|
import json
|
|
from selenium.webdriver.common.keys import Keys
|
|
from selenium.webdriver.edge.service import Service as EdgeService
|
|
from webdriver_manager.microsoft import EdgeChromiumDriverManager
|
|
|
|
def naviga_e_scarica_fatture(parametri):
|
|
driver = None
|
|
try:
|
|
# Usa Microsoft Edge
|
|
driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))
|
|
|
|
driver.delete_all_cookies() # Pulisce i cookie prima di iniziare
|
|
|
|
driver.get(parametri["url_login"])
|
|
print(f"Navigazione alla pagina di login: {parametri['url_login']}")
|
|
|
|
# Autenticazione
|
|
fisconline_entratel_tab = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='#tab-4']")))
|
|
fisconline_entratel_tab.click()
|
|
print("Cliccato tab Fisconline/Entratel.")
|
|
with open("credenziali_ade.json", "r") as f:
|
|
credenziali = json.load(f)
|
|
|
|
username_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "username-fo-ent")))
|
|
username_input.send_keys(credenziali["username"])
|
|
username_input.send_keys(Keys.TAB)
|
|
print(f"Username inserito: {credenziali['username']}")
|
|
|
|
password_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "password-fo-ent")))
|
|
password_input.send_keys(credenziali["password"])
|
|
password_input.send_keys(Keys.TAB)
|
|
password_input.send_keys(Keys.TAB)
|
|
print("Password inserita.")
|
|
|
|
pin_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "pin-fo-ent")))
|
|
pin_input.send_keys(credenziali["pin"])
|
|
print("PIN inserito.")
|
|
|
|
time.sleep(2)
|
|
# Clicca il pulsante "Accedi" tramite form
|
|
form = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//form[@action='/sam/UI/Login?realm=/agenziaentrate&service=pin']")))
|
|
form.submit()
|
|
print("Pulsante 'Accedi' cliccato.")
|
|
|
|
print("Login effettuato con successo. Attesa input manuale...")
|
|
input("Premi Invio per continuare dopo aver selezionato l'utenza manualmente...")
|
|
|
|
# Naviga alla pagina "Cambia Utenza"
|
|
driver.get("https://portale.agenziaentrate.gov.it/PortaleWeb/cambiautenza")
|
|
print("Navigazione alla pagina 'Cambia Utenza'.")
|
|
|
|
# Selezione utenza
|
|
codice_fiscale_presente = False
|
|
for _ in range(5): # Prova 5 volte con attesa
|
|
if parametri["codice_fiscale_referente"] in driver.page_source:
|
|
codice_fiscale_presente = True
|
|
break
|
|
time.sleep(2) # Attendi 2 secondi prima di riprovare
|
|
|
|
if not codice_fiscale_presente:
|
|
print(f"Errore: codice fiscale '{parametri['codice_fiscale_referente']}' non trovato nella pagina.")
|
|
return False
|
|
|
|
print(f"Codice fiscale '{parametri['codice_fiscale_referente']}' trovato nella pagina.")
|
|
|
|
# Verifica pagina pronta
|
|
if not verifica_pagina_pronta(driver, parametri["codice_fiscale_referente"], parametri["codice_fiscale_condominio"]):
|
|
return False
|
|
|
|
# Verifica se l'elemento select utenza è presente
|
|
try:
|
|
utente_select = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "utenza")))
|
|
print("Elemento select utenza trovato.")
|
|
except Exception as e:
|
|
print(f"Errore: l'elemento select utenza non è presente: {e}")
|
|
return False
|
|
|
|
# Verifica che il codice fiscale sia presente nel testo dell'elemento user-info-data-container
|
|
try:
|
|
user_info_data_container = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "user-info-data-container")))
|
|
if parametri["codice_fiscale_referente"] not in user_info_data_container.text:
|
|
print(f"Errore: codice fiscale '{parametri['codice_fiscale_referente']}' non trovato nel container user-info-data.")
|
|
return False
|
|
print(f"Codice fiscale '{parametri['codice_fiscale_referente']}' trovato nel container user-info-data.")
|
|
|
|
# Verifica la presenza del codice fiscale del condominio
|
|
if parametri["codice_fiscale_condominio"] not in user_info_data_container.text:
|
|
print(f"Errore: codice fiscale condominio '{parametri['codice_fiscale_condominio']}' non trovato nel container user-info-data.")
|
|
return False
|
|
print(f"Codice fiscale condominio '{parametri['codice_fiscale_condominio']}' trovato nel container user-info-data.")
|
|
except Exception as e:
|
|
print(f"Errore durante la verifica del codice fiscale nel container user-info-data: {e}")
|
|
return False
|
|
|
|
# Selezione utenza con attesa maggiore e verifica della selezionabilità
|
|
try:
|
|
# Prova con Select class
|
|
utente_select = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "utenza"))))
|
|
utente_select.select_by_value(parametri["codice_fiscale_referente"])
|
|
print(f"Utenza '{parametri['codice_fiscale_referente']}' selezionata con Select class.")
|
|
except Exception as e:
|
|
print(f"Errore durante la selezione con Select class: {e}")
|
|
try:
|
|
# Prova con JavaScript
|
|
driver.execute_script(f"document.getElementById('utenza').value = '{parametri['codice_fiscale_referente']}';")
|
|
print(f"Utenza '{parametri['codice_fiscale_referente']}' selezionata con JavaScript.")
|
|
time.sleep(2) # Aggiungi un'attesa di 2 secondi
|
|
except Exception as js_e:
|
|
print(f"Errore durante la selezione con JavaScript: {js_e}")
|
|
return False
|
|
|
|
# Attesa intervento manuale
|
|
input("Conferma manualmente il cambio di utenza e premi Invio...")
|
|
|
|
# Naviga alla sezione fatture
|
|
driver.get("https://portale.agenziaentrate.gov.it/PortaleWeb/servizi/accessoFatturazione")
|
|
print("Navigazione alla sezione fatture.")
|
|
|
|
# Verifica della sessione dopo l'intervento manuale
|
|
try:
|
|
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//a[@href='/FattureWeb/fatture/elenco']")))
|
|
print("Sessione verificata dopo l'intervento manuale.")
|
|
except Exception as e:
|
|
print(f"Errore: Sessione non valida dopo l'intervento manuale: {e}")
|
|
return False
|
|
|
|
# Navigazione alla pagina delle fatture
|
|
fatturazione_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='/PortaleWeb/servizi/accessoFatturazione']")))
|
|
print("link fatturazione elettronica trovato.")
|
|
fatturazione_link.click()
|
|
print("Accesso a 'Fatturazione elettronica'.")
|
|
time.sleep(2)
|
|
|
|
fatture_elettroniche_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='/FattureWeb/fatture/elenco']")))
|
|
print("link fatture elettroniche trovato.")
|
|
fatture_elettroniche_link.click()
|
|
print("Accesso a 'Fatture Elettroniche'.")
|
|
time.sleep(2)
|
|
|
|
# A questo punto, dovremmo essere nella pagina delle fatture
|
|
print("Sei nella pagina delle fatture. Procedi manualmente con il download o dammi i riferimenti per automatizzare.")
|
|
|
|
input("Premi invio per terminare")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Errore: {e}")
|
|
return False
|
|
|
|
finally:
|
|
if driver:
|
|
driver.quit()
|
|
|
|
def verifica_pagina_pronta(driver, codice_fiscale, codice_fiscale_condominio):
|
|
try:
|
|
# Verifica la presenza e la visibilità dell'elemento user-collapse
|
|
user_collapse_element = WebDriverWait(driver, 10).until(
|
|
EC.visibility_of_element_located((By.ID, "user-collapse"))
|
|
)
|
|
print("Elemento user-collapse visibile.")
|
|
|
|
# Verifica la presenza del codice fiscale
|
|
codice_fiscale_element = WebDriverWait(driver, 10).until(
|
|
EC.presence_of_element_located((By.XPATH, f"//p[contains(text(), '{codice_fiscale}')]"))
|
|
)
|
|
print(f"Codice fiscale '{codice_fiscale}' trovato.")
|
|
|
|
# verifica la presenza del link cambia utenza.
|
|
cambia_utenza_link = WebDriverWait(driver, 10).until(
|
|
EC.element_to_be_clickable((By.XPATH, "//a[@href='/PortaleWeb/cambiautenza']"))
|
|
)
|
|
print("link cambia utenza trovato.")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Errore: {e}")
|
|
return False
|
|
|
|
# Leggi i parametri dal file JSON
|
|
with open("parametri_fatture.json", "r") as f:
|
|
parametri = json.load(f)
|
|
|
|
if naviga_e_scarica_fatture(parametri):
|
|
print("Procedura completata.")
|
|
else:
|
|
print("Procedura fallita.") |