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

使用 playwright 自定义 js 下载的路径和文件名

遇到一个问题,点击按钮自动下载文件,路径和文件名都不能自定义,可以用 playwright 来解决这个问题

from playwright.sync_api import sync_playwright  
import os  
import time  class ExcelDownloader:  def __init__(self, download_path: str):  self.download_path = os.path.abspath(download_path)  os.makedirs(self.download_path, exist_ok=True)  def download(self, url: str, file_name: str):  with sync_playwright() as p:  browser = p.chromium.launch(headless=False)  # 设置 headless=True 可以隐藏浏览器  context = browser.new_context(  accept_downloads=True,  viewport={'width': 1920, 'height': 1080}  )  page = context.new_page()  try:  # 访问页面  page.goto(url)  # 等待页面加载完成  page.wait_for_load_state("networkidle")  # 等待按钮可见  page.wait_for_selector('button[ng-click="exportOrder()"]', state="visible")  # 开始监听下载  with page.expect_download() as download_info:  # 点击导出按钮  page.click('button[ng-click="exportOrder()"]')  # 获取下载对象  download = download_info.value  # 构建保存路径  save_path = os.path.join(self.download_path, file_name)  # 如果文件已存在则删除  if os.path.exists(save_path):  os.remove(save_path)  # 保存文件  download.save_as(save_path)  print(f"文件已下载到: {save_path}")  return save_path  except Exception as e:  print(f"下载失败: {str(e)}")  raise  finally:  context.close()  browser.close()  # 使用示例  
def main():  # 下载配置  config = {  "url": "https://example.com/page",  "download_path": "D:/Downloads",  "file_name": "export.xlsx"  }  downloader = ExcelDownloader(config["download_path"])  try:  file_path = downloader.download(  url=config["url"],  file_name=config["file_name"]  )  print(f"下载成功: {file_path}")  except Exception as e:  print(f"下载失败: {str(e)}")  if __name__ == "__main__":  main()
http://www.lryc.cn/news/537615.html

相关文章:

  • Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析
  • 3.从零开始学会Vue--{{生命周期,工程化,组件化}}
  • Python--网络编程
  • 【java】方法的基本内存原理(栈和堆)
  • SQLMesh 系列教程4- 详解模型特点及模型类型
  • SpringBoot(接受参数相关注解)
  • hbase合并队列超长问题分析
  • FPGA的星辰大海
  • 认识vue-admin
  • STM32、GD32驱动TM1640原理图、源码分享
  • spring boot 对接aws 的S3 服务,实现上传和查询
  • PH热榜 | 2025-02-12
  • 通过例子学 rust 个人精简版 1-1
  • HTTP的前世今生:如何塑造现代互联网的交互方式?
  • Flutter_学习记录_动画的简单了解
  • 【java】for (int num : numbers) { System.out.print(num + “ “); } for里的是什么意思
  • 内容中台驱动企业CMS架构优化与高效策略
  • 我用 Cursor 开发了一款个人小记系统
  • 百问网(100ask)提供的烧写工具的原理和详解;将自己编译生成的u-boot镜像文件烧写到eMMC中
  • doris:异步物化视图概述
  • 图像缩放的双线性插值实现方式
  • 深入剖析 Vue 的响应式原理:构建高效 Web 应用的基石
  • 40.日常算法
  • CAS单点登录(第7版)11.SSO SLO
  • Bob the Canadian
  • CAS单点登录(第7版)16.模仿
  • 预留:大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)
  • RabbitMQ介绍以及基本使用
  • C++演示中介模式
  • Vue的简单入门 一