Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Validador CFDI
#1
Hola colegas, estoy desarrollando un pequeño sistema validador de CFDI, ya tengo el código que me lee el xml y me extrae datos, también me conecto a la página de SAT (Aquí en México).

Pero tengo el error que no detecta el id "method":"css selector","selector":"[id="ctl00_MainContent_txtRFCEmisor"]", comparto el código que utilizo, igual y alguien le sirve.

Código:
import xml.etree.ElementTree as ET
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

def leer_datos_xml(ruta_xml):
    try:
        tree = ET.parse(ruta_xml)
        root = tree.getroot()

        # Espacio de nombres SAT (verifica en tu XML)
        ns = {'cfdi': 'http://www.sat.gob.mx/cfd/4', 'tfd': 'http://www.sat.gob.mx/TimbreFiscalDigital'}

        # Extraer datos clave
        emisor = root.find(".//cfdi:Emisor", ns).attrib.get('Rfc', 'No encontrado')
        receptor = root.find(".//cfdi:Receptor", ns).attrib.get('Rfc', 'No encontrado')
        total = root.attrib.get('Total', '0.00')
        uuid = root.find(".//tfd:TimbreFiscalDigital", ns).attrib.get('UUID', 'No encontrado')

        return emisor, receptor, total, uuid

    except Exception as e:
        print(f"Error al leer el XML: {e}")
        return None, None, None, None

def validar_cfdi_sat(rfc_emisor, rfc_receptor, total, uuid):
    url = "https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx"

    params = {
        'id': uuid,
        're': rfc_emisor,
        'rr': rfc_receptor,
        'tt': f"{float(total):.6f}"
    }

    try:
        ruta = r"C:\chromedriver\chromedriver.exe"
        service = Service(ruta)
        options = webdriver.ChromeOptions()
        # options.add_argument("--headless")
        driver = webdriver.Chrome(service=service, options=options)
        driver.get(url)
        driver.save_screenshot(r"validadorCFDI\error.png")
        # driver.quit

        # Esperar que cargue la página
        time.sleep(3)

        # Llenar los campos
        driver.find_element(By.ID, "ctl00_MainContent_txtRFCEmisor").send_keys(rfc_emisor)
        driver.find_element(By.ID, "ctl00_MainContent_txtRFCReceptor").send_keys(rfc_receptor)
        driver.find_element(By.ID, "ctl00_MainContent_txtUUID").send_keys(uuid)
        driver.find_element(By.ID, "ctl00_MainContent_txtTotal").send_keys(f"{float(total):.6f}")

        # Clic en el botón de consulta
        driver.find_element(By.ID, "ctl00_MainContent_btnConsultar").click()

        print(driver.page_source)

        # Esperar la respuesta
        time.sleep(5)

        # Obtener el estado del CFDI
        estado_element = driver.find_element(By.ID, "ctl00_MainContent_lblEstado")

        if estado_element:
            estado = estado_element.text.strip()
            driver.quit()
            return f"Estado del CFDI: {estado}"
        else:
            driver.quit()
            return "No se pudo obtener el estado del CFDI."

    except Exception as e:
        return f"Error en la consulta: {e}"

# ? Archivo XML de la factura
archivo_xml = r"validadorCFDI\OOTN8605082G3_FACCB7C.xml"

# Leer datos del XML
rfc_emisor, rfc_receptor, total, uuid = leer_datos_xml(archivo_xml)

if rfc_emisor and rfc_receptor and total and uuid:
    # Validar en el SAT
    resultado = validar_cfdi_sat(rfc_emisor, rfc_receptor, total, uuid)
    print(resultado)
else:
    print("No se pudieron extraer los datos del XML.")

El error que me arroja es el siguiente:
Código:
DevTools listening on ws://127.0.0.1:63266/devtools/browser/c00d1670-621d-4c29-838e-fd84e69745c6
Error en la consulta: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="ctl00_MainContent_txtRFCEmisor"]"}
  (Session info: chrome=134.0.6998.89); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
        GetHandleVerifier [0x00007FF7B78BFE45+26629]
        (No symbol) [0x00007FF7B7826010]
        (No symbol) [0x00007FF7B76B931A]
        (No symbol) [0x00007FF7B770F8E7]
        (No symbol) [0x00007FF7B770FB1C]
        (No symbol) [0x00007FF7B77634A7]
        (No symbol) [0x00007FF7B7737AEF]
        (No symbol) [0x00007FF7B7760169]
        (No symbol) [0x00007FF7B7737883]
        (No symbol) [0x00007FF7B7700550]
        (No symbol) [0x00007FF7B7701803]
        GetHandleVerifier [0x00007FF7B7C172BD+3529853]
        GetHandleVerifier [0x00007FF7B7C2DA22+3621858]
        GetHandleVerifier [0x00007FF7B7C224D3+3575443]
        GetHandleVerifier [0x00007FF7B798B77A+860474]
        (No symbol) [0x00007FF7B783088F]
        (No symbol) [0x00007FF7B782CBC4]
        (No symbol) [0x00007FF7B782CD66]
        (No symbol) [0x00007FF7B781C2C9]
        BaseThreadInitThunk [0x00007FFAB05E7374+20]
        RtlUserThreadStart [0x00007FFAB199CC91+33]
Responder
#2
Cambia los " for '.

Por ejemplo:


Código:
driver.find_element(By.ID, 'ctl00_MainContent_TxtUUID').send_keys("dddddddd-dddd-dddd-dddd-ddddddddd___")
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)