如何通过Python Selenium修改Chrome自动下载的文件名
解决Selenium点击下载后修改默认文件名的问题
问题说明
需要通过Python Selenium点击下载按钮后,修改系统保存对话框中的默认文件名并保存,但原代码中切换窗口修改文件名的逻辑无效——系统弹窗不属于浏览器窗口,Selenium无法直接操作这类系统级控件。
原尝试代码:
from selenium import webdriver from selenium.webdriver.common.by import By import time options = webdriver.ChromeOptions() prefs = {"download.prompt_for_download":True, "download.default_directory": r"C:\Music\\",#IMPORTANT - ENDING SLASH V IMPORTANT "directory_upgrade": True} options.add_experimental_option("prefs", prefs) driver =webdriver.Chrome(executable_path=r".\bot_automation\drivers\chromedriver.exe",chrome_options=options) driver.get('https://www.browserstack.com/test-on-the-right-mobile-devices') gotit = driver.find_element(By.ID,'accept-cookie-notification') gotit.click() downloadcsv = driver.find_element(By.CSS_SELECTOR,'.icon-csv') downloadcsv.click() # 以下代码无效,需要替换 file_window=driver.switch_to.window(driver.window_handles[1]) file_window.clear() file_window.send_keys("Hii text") # 还需要按回车保存 time.sleep(5) driver.close()
解决方案
方案一:用pyautogui模拟系统弹窗操作
借助第三方库模拟键盘输入,绕过Selenium无法控制系统对话框的限制:
- 先安装依赖:
pip install pyautogui
- 修改后的代码:
from selenium import webdriver from selenium.webdriver.common.by import By import time import pyautogui options = webdriver.ChromeOptions() prefs = { "download.prompt_for_download": True, "download.default_directory": r"C:\Music\\", "directory_upgrade": True } options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(executable_path=r".\bot_automation\drivers\chromedriver.exe", options=options) driver.get('https://www.browserstack.com/test-on-the-right-mobile-devices') gotit = driver.find_element(By.ID, 'accept-cookie-notification') gotit.click() downloadcsv = driver.find_element(By.CSS_SELECTOR, '.icon-csv') downloadcsv.click() # 等待弹窗加载(时间根据实际情况调整) time.sleep(2) # 全选默认文件名(Ctrl+A) pyautogui.hotkey('ctrl', 'a') # 输入新文件名 pyautogui.typewrite("Hii text") # 按回车保存 pyautogui.press('enter') time.sleep(5) driver.quit()
注意:运行时不要切换窗口,确保浏览器弹窗处于焦点,否则输入会失效。
方案二:自动下载后重命名(更稳定推荐)
关闭下载提示,让文件自动下载到指定目录,之后再重命名,完全规避系统弹窗操作:
from selenium import webdriver from selenium.webdriver.common.by import By import time import os from glob import glob options = webdriver.ChromeOptions() prefs = { "download.prompt_for_download": False, # 关闭下载弹窗提示 "download.default_directory": r"C:\Music\\", "directory_upgrade": True, "profile.default_content_settings.popups": 0 } options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(executable_path=r".\bot_automation\drivers\chromedriver.exe", options=options) driver.get('https://www.browserstack.com/test-on-the-right-mobile-devices') gotit = driver.find_element(By.ID, 'accept-cookie-notification') gotit.click() downloadcsv = driver.find_element(By.CSS_SELECTOR, '.icon-csv') downloadcsv.click() # 等待下载完成(可根据文件大小调整等待时间,或用更精准的文件检查逻辑) time.sleep(5) # 获取下载目录下最新的csv文件 download_dir = r"C:\Music" list_of_files = glob(os.path.join(download_dir, "*.csv")) latest_file = max(list_of_files, key=os.path.getctime) # 重命名文件 new_file_name = os.path.join(download_dir, "Hii text.csv") os.rename(latest_file, new_file_name) driver.quit()
此方法不受系统环境限制,稳定性更高,适合大多数自动化场景。
内容的提问来源于stack exchange,提问作者abhi krishnan
相关产品推荐
相关产品推荐

