当前位置: 首页 > news >正文

wan2.1-vae Web UI自动化:Selenium脚本实现定时生成+自动保存+文件归档

wan2.1-vae Web UI自动化:Selenium脚本实现定时生成+自动保存+文件归档

1. 平台与自动化需求概述

muse/wan2.1-vae是基于Qwen-Image-2512模型的AI图像生成平台,支持中英文提示词生成高质量图像。在实际应用中,我们经常需要:

  • 定时批量生成特定主题的图像
  • 自动保存生成结果到指定目录
  • 按日期/主题分类归档文件
  • 无人值守完成重复性工作

传统手动操作方式效率低下,本文将介绍如何使用Selenium实现Web UI自动化,解决上述痛点。

2. 环境准备与基础配置

2.1 安装必要组件

pip install selenium webdriver-manager pillow

2.2 WebDriver配置

from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 自动下载并配置ChromeDriver service = Service(ChromeDriverManager().install()) options = webdriver.ChromeOptions() options.add_argument("--headless") # 无头模式 options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(service=service, options=options)

3. 自动化脚本核心实现

3.1 登录与页面导航

def login_to_wan21(url, wait_time=10): driver.get(url) try: # 等待页面加载完成 WebDriverWait(driver, wait_time).until( EC.presence_of_element_located((By.ID, "prompt-textarea")) ) print("页面加载成功") except Exception as e: print(f"页面加载失败: {str(e)}") driver.quit()

3.2 图像生成参数设置

def set_generation_parameters(prompt, negative_prompt="", width=1024, height=1024, steps=28, cfg_scale=7.5): # 输入提示词 prompt_area = driver.find_element(By.ID, "prompt-textarea") prompt_area.clear() prompt_area.send_keys(prompt) # 设置负面提示词 if negative_prompt: neg_prompt_area = driver.find_element(By.ID, "negative-prompt-textarea") neg_prompt_area.clear() neg_prompt_area.send_keys(negative_prompt) # 设置图像尺寸 width_input = driver.find_element(By.XPATH, "//input[@aria-label='Width']") width_input.clear() width_input.send_keys(str(width)) height_input = driver.find_element(By.XPATH, "//input[@aria-label='Height']") height_input.clear() height_input.send_keys(str(height)) # 设置推理步数 steps_input = driver.find_element(By.XPATH, "//input[@aria-label='Steps']") steps_input.clear() steps_input.send_keys(str(steps)) # 设置引导系数 cfg_input = driver.find_element(By.XPATH, "//input[@aria-label='Guidance Scale']") cfg_input.clear() cfg_input.send_keys(str(cfg_scale))

3.3 定时生成与自动保存

import time from datetime import datetime import os from PIL import Image import io def auto_generate_and_save(prompt, output_dir, interval=300, max_count=10): if not os.path.exists(output_dir): os.makedirs(output_dir) for i in range(max_count): # 生成图像 generate_btn = driver.find_element(By.ID, "generate-button") generate_btn.click() # 等待生成完成 time.sleep(30) # 根据实际生成时间调整 # 保存图像 img_element = driver.find_element(By.XPATH, "//div[contains(@class, 'generated-image')]//img") img_src = img_element.get_attribute("src") # 下载并保存图像 img_data = driver.execute_script(""" var img = arguments[0]; var canvas = document.createElement('canvas'); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; var ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); return canvas.toDataURL('image/png').substring(22); """, img_element) img_bytes = io.BytesIO(base64.b64decode(img_data)) img = Image.open(img_bytes) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"{output_dir}/generated_{timestamp}_{i}.png" img.save(filename) print(f"已保存: {filename}") # 等待间隔 if i < max_count - 1: time.sleep(interval)

4. 文件归档与管理

4.1 按日期分类归档

import shutil from datetime import datetime def archive_by_date(source_dir, archive_root): today = datetime.now().strftime("%Y%m%d") archive_dir = os.path.join(archive_root, today) if not os.path.exists(archive_dir): os.makedirs(archive_dir) for filename in os.listdir(source_dir): if filename.endswith(".png"): src_path = os.path.join(source_dir, filename) dst_path = os.path.join(archive_dir, filename) shutil.move(src_path, dst_path) print(f"文件已归档到: {archive_dir}")

4.2 自动清理旧文件

def cleanup_old_files(directory, days_to_keep=7): now = time.time() cutoff = now - (days_to_keep * 86400) for filename in os.listdir(directory): file_path = os.path.join(directory, filename) if os.path.isfile(file_path): file_time = os.path.getmtime(file_path) if file_time < cutoff: os.remove(file_path) print(f"已删除旧文件: {filename}")

5. 完整自动化流程示例

if __name__ == "__main__": # 初始化 base_url = "https://gpu-{实例ID}-7860.web.gpu.csdn.net/" output_dir = "./generated_images" archive_dir = "./archived_images" try: # 登录平台 login_to_wan21(base_url) # 设置生成参数 prompt = "未来城市景观,赛博朋克风格,霓虹灯光,8K超高清" negative_prompt = "低质量,模糊,变形,水印" set_generation_parameters(prompt, negative_prompt, width=1024, height=1024) # 定时生成并保存 auto_generate_and_save(prompt, output_dir, interval=600, max_count=5) # 文件归档 archive_by_date(output_dir, archive_dir) # 清理旧文件(保留最近7天) cleanup_old_files(archive_dir) except Exception as e: print(f"自动化执行出错: {str(e)}") finally: driver.quit()

6. 进阶优化建议

6.1 错误处理与重试机制

def safe_generate(retries=3): for attempt in range(retries): try: generate_btn = driver.find_element(By.ID, "generate-button") generate_btn.click() return True except Exception as e: print(f"生成失败(尝试 {attempt + 1}/{retries}): {str(e)}") time.sleep(5) return False

6.2 多主题轮换生成

themes = [ {"prompt": "山水风景,中国水墨画风格", "negative": "人物,建筑"}, {"prompt": "科幻太空站,未来科技感", "negative": "古代,传统"}, {"prompt": "精致美食摄影,高光细节", "negative": "模糊,昏暗"} ] for theme in themes: set_generation_parameters(theme["prompt"], theme["negative"]) auto_generate_and_save(theme["prompt"], output_dir, interval=300, max_count=2)

6.3 性能监控与日志记录

import logging logging.basicConfig( filename='wan21_automation.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) def log_generation_details(prompt, params, generation_time): logging.info(f"生成完成 - 提示词: {prompt}") logging.info(f"参数: {params}") logging.info(f"耗时: {generation_time:.2f}秒")

7. 总结与最佳实践

通过Selenium实现的自动化方案可以显著提高wan2.1-vae平台的使用效率,以下是关键实践建议:

  1. 参数优化:根据生成内容类型调整分辨率、步数和引导系数
  2. 稳定运行:添加足够的等待时间和错误处理机制
  3. 资源管理:定期归档和清理生成的文件
  4. 扩展性:可通过配置文件管理提示词和参数组合
  5. 监控:记录生成日志用于质量分析和优化

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/483258/

相关文章:

  • DAMO-YOLO TinyNAS模型服务化实战:FastAPI部署
  • 3大创新让普通鼠标效率提升200%:重新定义Mac交互体验
  • 基于ESP32的便携式嵌入式游戏机硬件设计与低功耗实践
  • Linux 用户和用户组管理1211
  • PyTorch中AdaptiveAvgPool2d导出ONNX失败的3种替代方案(附代码对比)
  • 基于8051的双模生理参数监测终端设计
  • Dify + Kubernetes + Istio 三端集成实战(生产环境零宕机迁移SOP首次公开)
  • 效率倍增:借助快马平台的kimi apikey自动生成常用工具函数
  • Qwen-Ranker Pro与机器学习基础:从理论到实践
  • Testbench搭建避坑指南:当1ns/1ps遇到1ps/1ps时怎么办?
  • Yi-Coder-1.5B异常处理专家:智能诊断与修复方案生成
  • 加密压缩包密码恢复:让尘封数据重见天日的开源解决方案
  • GLM-OCR企业级实战:搭建永久在线的智能文档处理CRM系统
  • 手把手教你用MATLAB处理线性调频信号:从理论到代码的完整避坑指南
  • 基于CW32F030的高稳定性数字电压电流表设计
  • 基于RA2L1的嵌入式电子时钟全栈设计
  • Fish Speech 1.5快速入门:Web界面操作,无需代码基础
  • Unity 3D游戏开发避坑指南:从场景构建到性能优化的实战经验
  • 本地DeepSeek构建专属知识库实战:Page Assist与AnythingLLM双方案评测
  • 避开工业相机同步采样的5个大坑:多设备触发时序优化心得
  • 立创EDA开源项目:小智Moon圆屏AI聊天机器人DIY全解析(ESP32-S3主控+WS2812氛围灯)
  • Apple-Mobile-Drivers-Installer:解决Windows苹果设备连接问题的智能脚本方案
  • 5个数据采集新手常踩的坑:从MySQL到Kafka的实战避坑指南
  • openclaw v2026.3.13 发布:一次为修复而生的不可变恢复版本,涵盖网关、Agents、UI、移动端、Docker、浏览器与安全的全面升级
  • Flutter SliverMainAxisGroup实战:打造动态滚动布局的5个技巧
  • Funmangic[特殊字符]百度智能云:在3D互动游戏里,让AI陪你演一场不散场的戏
  • Audio Pixel Studio保姆级教程:从零搭建极简音频工作站,支持多端响应式访问
  • ROS2时间管理实战:用Timer和Rate打造精准时钟节点(附完整代码)
  • Mamba在视频理解中的实战应用:从时序建模到多模态交互的完整指南
  • 1. 泰山派RK3566开发板Linux环境搭建:从虚拟机安装到SSH/Samba配置全攻略