HOWTO · Python
El método send_keys() en Selenium Python
Este tutorial demuestra cómo usar el método send_keys() en Selenium Python.
En esta página
send_keys() es un método del WebElement de Selenium que envía texto y pulsaciones de teclado a un elemento localizado: normalmente un cuadro de texto, un campo de formulario o cualquier control editable. Una vez que tienes el elemento, element.send_keys("your text") escribe cada carácter en él, y element.send_keys(Keys.ENTER) envía una tecla con nombre como Enter. Es la forma estándar de rellenar formularios, ejecutar búsquedas y comprobar cómo reacciona una aplicación a la entrada escrita.
Qué hace send_keys() en Selenium Python
send_keys() está definido en WebElement, así que siempre lo llamas sobre un elemento que ya has localizado, por ejemplo driver.find_element(By.NAME, "q").send_keys("selenium"). El método acepta uno o más valores —su firma es variádica, send_keys(*value)— y cada valor es una cadena de caracteres que escribir, enviados en el orden dado. Las teclas especiales (Enter, Tab, Backspace y los modificadores) están en selenium.webdriver.common.keys.Keys; cada constante es un solo carácter del área de uso privado de Unicode, así que puedes mezclarlas en una cadena normal o pasarlas como argumentos separados, como en element.send_keys("text", Keys.ENTER). element.send_keys("selenium" + Keys.ENTER) escribe el texto y después pulsa Enter.
En la práctica importan dos detalles:
send_keys()simula la escritura. Solo introduce la entrada: la propia lógica de la aplicación decide qué ocurre después. Que un inicio de sesión se rechace, que una búsqueda se ejecute o que un campo muestre un mensaje es comportamiento de la aplicación que tu prueba observa, no algo quesend_keys()realice.- El elemento debe poder recibir entrada. Los campos de texto, las áreas de texto, los elementos
contenteditabley los campos de archivo (que aceptan una ruta de archivo como texto) funcionan; enviar teclas a un<div>normal entrega los eventos, pero en general no cambia nada.
Configurar una página y localizar un elemento
Antes de poder enviar teclas, inicia un driver, abre la página y encuentra el elemento de destino. Con from selenium import webdriver y from selenium.webdriver.common.by import By, la configuración mínima es driver = webdriver.Chrome(), driver.get("https://www.google.com/") y después search_box = driver.find_element(By.NAME, "q"). El Selenium actual (versión 4) localiza los elementos mediante driver.find_element(By.*, "..."); los métodos antiguos find_element_by_id, find_element_by_name y similares se eliminaron.
Para páginas que renderizan los campos de forma dinámica, espera el elemento en lugar de adivinar: WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q"))) lo devuelve en cuanto está listo, usando WebDriverWait de selenium.webdriver.support.ui y expected_conditions as EC de selenium.webdriver.support. Un time.sleep() fijo antes de localizar es frágil, porque la prueba sigue fallando si el elemento se renderiza tarde.
Prefiere el localizador más estable disponible: primero el ID del elemento, después un name o un selector CSS, y XPath para búsquedas basadas en la estructura. Los fragmentos para el navegador de este artículo asumen pip install selenium más un navegador instalado, con el driver resuelto mediante Selenium Manager. Están escritos para Selenium 4 y se muestran como sintaxis en línea para adaptar, no como ejemplos ejecutados aquí.
Enviar texto y teclas del teclado
Para rellenar un campo, pasa el texto a send_keys(); para enviar el formulario, añade Keys.ENTER o envíalo en una segunda llamada (Keys está en selenium.webdriver.common.keys). En la página de Google localizada antes, search_box.send_keys("This is filed by Selenium send keys") escribe la consulta y search_box.send_keys(Keys.ENTER) la envía. Un modificador enviado dentro de send_keys() —por ejemplo Keys.CONTROL + "a"— pulsa las teclas a la vez, pero queda presionado hasta que lo sueltas explícitamente, ya sea enviando el mismo modificador otra vez o enviando Keys.NULL. Keys.chord(Keys.CONTROL, "a") es la forma que libera los modificadores por sí sola, porque añade Keys.NULL después de la combinación.
La captura muestra el texto escrito en el campo de búsqueda de Google.
Una constante de Keys es un solo carácter, así que construir la cadena tú mismo muestra exactamente lo que añade una combinación. Ejecuta este ejemplo (el código y sus comentarios se mantienen en inglés):
select_all = "\ue009" + "a" # Keys.CONTROL + "a"
field_value = "selenium" + "\ue007" # text + Keys.ENTER
print(len(select_all), len(field_value))
2 9
Cada constante de Keys cuenta como un carácter, así que "selenium" + Keys.ENTER envía nueve eventos de tecla: ocho letras más Enter.
Validar la entrada y verificar los resultados
send_keys() no realiza ninguna comprobación por sí mismo: la aplicación es la que valida. Para probar la validación, envía un valor, activa la aplicación y después lee lo que muestra. En un formulario de inicio de sesión la secuencia es email = driver.find_element(By.NAME, "email"), email.send_keys("not-an-email"), email.send_keys(Keys.ENTER), y después dos verificaciones habituales: email.get_attribute("value") lee el contenido del campo —los campos de texto guardan su contenido en value, no en el .text del elemento— y driver.find_element(By.CSS_SELECTOR, ".error-message").text lee la respuesta que renderiza la aplicación.
El mismo patrón cubre los escenarios habituales. En un campo de correo electrónico, envía un valor que incumpla el formato y confirma que la aplicación lo rechaza; en un campo de contraseña, envía valores que incumplan cada regla y confirma el mensaje correspondiente; en una barra de búsqueda, envía una consulta y comprueba que los resultados que devuelve la aplicación son relevantes. En todos los casos send_keys() aporta las pulsaciones de teclas, y tus aserciones confirman cómo responde la aplicación.
Borrar o reemplazar texto
Para sobrescribir un campo tienes dos opciones:
element.clear()vacía un campo editable con un solo comando de WebDriver.- La edición por teclado borra o selecciona el texto una pulsación cada vez:
Keys.BACKSPACEelimina el carácter anterior al cursor,Keys.DELETEelimina el siguiente, yKeys.CONTROL + "a"selecciona todo para que la siguiente llamada asend_keys()lo reemplace.
La distinción importa cuando un campo reacciona a cada pulsación: los autocompletados y los formateadores en vivo pueden necesitar eventos de tecla reales, mientras que clear() dispara una única actualización. En el cuadro de búsqueda de Google la secuencia de edición es search_box.send_keys("For test purpose") para escribir un valor, search_box.send_keys(3 * Keys.BACKSPACE) para borrar sus tres últimos caracteres (queda “For test purp”), search_box.clear() para vaciar el campo y search_box.send_keys("testing second key") para escribir un texto nuevo. Un time.sleep(3) entre llamadas te permite ver cada paso en el navegador, y driver.quit() lo cierra al terminar.
Primer paso: el texto se escribe en el campo:
Segundo paso: Backspace elimina tres caracteres y queda “For test purp”:
Tercer paso: clear() vacía el campo y se vuelve a escribir texto nuevo:
Solucionar problemas de send_keys()
Cuando la entrada no llega al elemento, recorre estas comprobaciones:
NoSuchElementException: el localizador no coincide, la página aún no ha terminado de renderizarse, o el elemento está dentro de un<iframe>o de un shadow DOM. Espera conWebDriverWaity usadriver.switch_to.frame(...)para el contenido enmarcado.StaleElementReferenceException: la página se volvió a renderizar después de que localizaras el elemento, así que localízalo de nuevo justo antes de escribir.ElementNotInteractableException: el elemento está oculto, deshabilitado o cubierto. Desplázalo hasta que sea visible, espera aelement_to_be_clickabley comprueba los atributosdisabledyreadonly: un campo de solo lectura rechaza la entrada.InvalidElementStateException: el destino no se puede editar, por ejemplo al llamar aclear()sobre un elemento no editable.- No aparece nada: el foco puede estar en otro sitio. Haz clic primero en el elemento, o contrólalo con
ActionChains(driver).move_to_element(el).click().send_keys(text). Confirma lo que llegó leyendoelement.get_attribute("value"). - Atajos y teclas especiales: usa las constantes de
KeysoKeys.chord();send_keys()envía caracteres, no pulsaciones físicas, así que no controla la composición IME para los sistemas de escritura que la necesitan.