Ejercicios de Selenium para Manejo de Elementos y Ventanas
Este artículo aborda ejercicios prácticos de automatización web utilizando Selenium en Python, incluyendo la interacción con frames, ventanas múltiples, dropdowns y métodos de verificación. También se cubren conceptos fundamentales de clasificación de pruebas y técnicas de diseño de casos de prueba.
1. Manejo de Frames con Selenium
Para interactuar con frames en una página web, se utiliza el método switch_to.frame(). A continuación, un ejemplo con un archivo HTML local:
from selenium import webdriver
import time as espera
navegador = webdriver.Chrome()
navegador.get('file:///D:/code/testDev/UI%E8%87%AA%E5%8A%A8%E5%8C%96/index.html')
# Entrar al frame por índice
navegador.switch_to.frame(0)
campo_usuario = navegador.find_element_by_id('username')
campo_usuario.send_keys('ejemplo')
espera.sleep(3)
navegador.quit()
2. Frames Anidados y Retorno al Contenido Principle
En casos de frames anidados, se puede acceder a un frame interno y luego volver al contenido principal con switch_to.default_content().
navegador = webdriver.Chrome()
navegador.get('file:///D:/code/testDev/UI%E8%87%AA%E5%8A%A8%E5%8C%96/index1.html')
navegador.switch_to.frame(0)
campo_busqueda = navegador.find_element_by_id('sb_form_q')
campo_busqueda.send_keys('prueba')
espera.sleep(3)
navegador.switch_to.default_content()
campo_principal = navegador.find_element_by_id('username')
campo_principal.send_keys('valor')
espera.sleep(3)
navegador.quit()
3. Ejemplo Práctico con Correo Electrónico (QQ y NetEase)
Para aplicaciones web como correos electrónicos, se accede a iframes para interactuar con campos de inicio de sesión.
# Ejemplo con QQ Mail
navegador = webdriver.Chrome()
navegador.get('https://mail.qq.com/')
navegador.switch_to.frame('login_frame')
campo_correo = navegador.find_element_by_id('u')
campo_correo.send_keys('usuario')
espera.sleep(3)
campo_contrasena = navegador.find_element_by_id('p')
campo_contrasena.send_keys('contraseña')
espera.sleep(3)
navegador.quit()
# Ejemplo con NetEase Mail
navegador = webdriver.Chrome()
navegador.maximize_window()
navegador.get('https://mail.163.com/')
navegador.switch_to.frame(0)
campo_email = navegador.find_element_by_name('email')
campo_email.send_keys('ejemplo@163.com')
espera.sleep(3)
campo_pwd = navegador.find_element_by_name('password')
campo_pwd.send_keys('secreto')
espera.sleep(3)
navegador.quit()
4. Manejo de Ventanas Múltiples
Para cambiar entre ventanas, se obtienen los identificadores de ventanas y se itera para localizar la ventana deseada.
navegador = webdriver.Chrome()
navegador.maximize_window()
navegador.get('https://mail.sina.com.cn/')
ventana_actual = navegador.current_window_handle
# Abrir nueva ventana al hacer clic en "Registrar"
enlace_registro = navegador.find_element_by_link_text('注册')
enlace_registro.click()
espera.sleep(3)
todas_ventanas = navegador.window_handles
for ventana in todas_ventanas:
if ventana != ventana_actual:
navegador.switch_to.window(ventana)
campo_registro = navegador.find_element_by_name('email')
campo_registro.send_keys('nuevo_usuario')
espera.sleep(3)
navegador.close()
navegador.switch_to.window(ventana_actual)
campo_inicio = navegador.find_element_by_id('freename')
campo_inicio.send_keys('datos')
espera.sleep(3)
navegador.quit()
5. Métodos de Selenium: clear(), is_displayed(), is_enabled()
Estos métodos pemriten interactuar con elementos de manera más controlada.
navegador = webdriver.Chrome()
navegador.maximize_window()
navegador.get('https://mail.sina.com.cn/')
campo_nombre = navegador.find_element_by_id('freename')
campo_nombre.send_keys('valor_inicial')
print('Valor ingresado:', campo_nombre.get_attribute('value'))
espera.sleep(3)
campo_nombre.clear() # Limpiar el campo
espera.sleep(3)
navegador.quit()
# Verificar visibilidad
enlace_contrasena = navegador.find_element_by_link_text('忘记密码?')
print('¿Es visible?:', enlace_contrasena.is_displayed())
# Verificar si es editable
campo_editable = navegador.find_element_by_id('freename')
print('¿Es editable?:', campo_editable.is_enabled())
6. Uso de Dropdowns con la Clase Select
Para manejar menús desplegables, se utiliza la clase Select de Selenium.
from selenium.webdriver.support.select import Select
navegador = webdriver.Chrome()
navegador.maximize_window()
navegador.get('file:///D:/code/testDev/UI%E8%87%AA%E5%8A%A8%E5%8C%96/select.html')
elemento_desplegable = navegador.find_element_by_name('nr')
selector = Select(elemento_desplegable)
espera.sleep(3)
# Seleccionar por índice
selector.select_by_index(2)
espera.sleep(3)
# Seleccionar por valor
selector.select_by_value('Java')
espera.sleep(3)
# Seleccionar por texto visible
selector.select_by_visible_text('Java语言')
espera.sleep(3)
navegador.quit()
7. Ejemplo Integrado con XPath en Boss Zhipin
En sitios web dinámicos como portales de empleo, se usan XPath para localizar elementos específicos.
navegador = webdriver.Chrome()
navegador.maximize_window()
navegador.get('https://www.zhipin.com/xian/?sid=sem_pz_360pc_title')
# Interactuar con filtros mediante XPath
boton_filtro = navegador.find_element_by_xpath('//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[2]/div/span/b')
boton_filtro.click()
espera.sleep(3)
opcion1 = navegador.find_element_by_xpath('//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[4]/div/div/ul[1]/li[3]')
opcion1.click()
espera.sleep(3)
opcion2 = navegador.find_element_by_xpath('//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[4]/div/div/ul[2]/li[3]')
opcion2.click()
espera.sleep(3)
opcion3 = navegador.find_element_by_xpath('//*[@id="wrap"]/div[3]/div/div[1]/div[1]/form/div[4]/div/div/ul[3]/li[2]')
opcion3.click()
espera.sleep(3)
campo_busqueda = navegador.find_element_by_name('qurey')
campo_busqueda.send_keys('Arquitecto de Pruebas')
espera.sleep(3)
8. Manipulación de Listas Anidadas en Python
Para acceder a datos en estructuras complejas como listas anidadas, se utilizan índices y claves.
datos = [{'nombre': 'ejemplo', 'estudiante': [{'empresa': [{'lenguaje': 'Go'}]}]}]
resultado = datos[0]['estudiante'][0]['empresa'][0]['lenguaje']
print('Lenguaje extraído:', resultado) # Salida: Go
9. Clasificación de Pruebas por Etapas de Desarrollo
Las pruebas de software se categorizan según la fase del ciclo de desarrollo:
- Pruebas Unitarias: Enfocadas en componentes individuales, utilizando frameworks como JUnit para Java o Pytest para Python.
- Pruebas de Integración: Validan la interacción entre módulos combinados, verificando funcionalidad y compatibilidad.
- Pruebas de Sistema: Evalúan el sistema completo, incluyendo rendimiento y entorno operativo.
- Pruebas de Aceptación: Realizadas antes del despliegue, aseguran que el software cumple con requisitos contractuales.
10. Técnicas de Diseño de Casos de Prueba
Partición de Equivalencia: Divide el dominio de entrada en clases donde los datos se comportan similarmente. Por ejemplo, para un campo de mes, valores entre 1 y 12 son válidos (clase válida), mientras que 0 o 13 son inválidos (clase inválida).
Análisis de Valores Límite: Se enfoca en los bordes de las particiones. Usando el mismo ejemplo, los límites serían 1 y 12, probando valores como 0, 1, 12 y 13 para detectar errores comunes.