Debido a la inestabilidad de la automatización de la capa de la interfaz de usuario, es común encontrar interrupciones en la ejecución o fallas en los casos de uso. Estas son algunas medidas comunes que se deben tomar.
1. Registros detallados
2. Capturas de pantalla cuando se colocan errores
3. Mecanismo de almacenamiento en caché de Pytest (puede registrar éxitos y fallas)
4. Mecanismo de reintento automático (como pytest-rerunfailures)
5. Video de caso de uso
El registro de casos de uso es la forma más intuitiva de ver operaciones en tiempo real. Muchas plataformas en la nube, como Saucelabs, brindan la función de registro de casos de uso.
Desafortunadamente, sin embargo, el selenio en sí mismo no tiene esta capacidad. Además de usar software de terceros como ffmpeg para grabar la pantalla de forma sincrónica, otro método de implementación es iniciar otro hilo, tomar capturas de pantalla continuamente y finalmente unir las imágenes en git.
El método de operación es el siguiente.
captura de pantalla en tiempo real
1. Escriba una captura de función de captura de pantalla en bucle
def shot(dr):
i = 0
while True:
img_file = os.path.join(img_dir, f'{i}.png')
intente:
dr.save_screenshot(img_file)
excepto:
devuelva
i += 1
debido a la interfaz webdriver ejecución El límite de velocidad del comando de captura de pantalla, no es necesario dormir para cada ronda de captura de pantalla.
2. Cuando opere la web, inicie un hilo
img_dir = 'img' # directorio de imágenes temporales
dr = webdriver.Chrome()
t = threading.Thread(target=shot, args=(dr, img_dir)) # Crear un nuevo hilo
t.start() # Iniciar el hilo de la captura de pantalla
dr.get('https://www.baidu.com')
dr.find_element('id', 'kw').send_keys('简书 韩志超')
dr.find_element('id', 'su'). clic()
tiempo.dormir(1)
dr.get('https://www.qq.com')
dr.back()
tiempo.dormir(2)
dr.salir()
3. Unir imágenes en gif
Es necesario instalar la almohada: pip install pillow
img_list = os.listdir(img_dir) # Listar todas las imágenes en el directorio
img_list.sort(key=lambda x: int(x[:-4])) # Ordenar
first_img = Image.open(os.path.join(img_dir, img_list[0])) # El primer objeto de imagen
else_imgs = [Image.open(os.path.join(img_dir, img)) para img en img_list[1 : ]] # objetos de imagen restantes
first_img.save("record.gif", append_images=else_imgs,
duration=300,
save_all=True) # guardar inmediatamente
código completo
desde selenium import webdriver
import threading
import os
import time
from PIL import Image
def clear_dir(ruta):
"""Crear o borrar un directorio"""
if not os.path.isdir(ruta):
os.mkdir(ruta) # crear un directorio
else: # borrar un directorio
[os.remove(os .ruta.join(ruta, nombre_archivo)) para nombre_archivo en os.listdir(ruta)]
def shot(dr, img_dir):
"""Función de captura de pantalla en bucle"""
i = 0
clear_dir(img_dir) # Limpiar el directorio
mientras es True:
img_file = os.path.join(img_dir, f'{i}.png')
intente:
dr.save_screenshot(img_file)
excepto:
return
i += 1
# Operación de Selenium
img_dir = 'img' # Directorio de imágenes temporales
dr = webdriver.Chrome()
t = threading.Thread(target=shot, args=(dr, img_dir)) # Crear un nuevo hilo
t.start() # Iniciar el hilo de la captura de pantalla
dr.get('https://www.baidu.com')
dr.find_element('id', 'kw').send_keys('简书 韩志超')
dr.find_element('id', 'su'). clic()
tiempo.dormir(1)
dr.get('https://www.qq.com')
dr.back()
tiempo.dormir(2)
dr.salir()
# Unir imágenes en gif
img_list = os.listdir(img_dir) # Listar todas las imágenes en el directorio
img_list.sort(key=lambda x: int(x[:-4])) # Ordenar
first_img = Image.open(os.path.join(img_dir, img_list[0])) # El primer objeto de imagen
else_imgs = [Image.open(os.path.join(img_dir, img)) para img en img_list[1 : ]] # objetos de imagen restantes
first_img.save("record.gif", append_images=else_imgs,
duration=300, # Tiempo de transición de cada imagen
save_all=True) # Empalme y guardado, si desea reproducir en bucle, puede agregar loop=0