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.")