You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Edge浏览器中Selenium C#文件保存操作失败问题求助

问题分析与解决方案

核心问题

Selenium的Actions类只能控制浏览器内的DOM元素,系统级的“另存为”对话框不在Selenium的控制范围——你之前模拟的SendKeys("test.pdf")和SendKeys(Keys.Return)实际是发送给了浏览器窗口,而非弹出的系统对话框,这就是后续操作失效的根本原因。

可行解决方案

方案1:配置Edge自动下载(优先推荐)

通过Edge浏览器配置,直接跳过“另存为”窗口,让文件自动下载到指定目录,避免系统对话框的干扰:

using OpenQA.Selenium.Edge;
using System.IO;
using System;

// 初始化Edge配置
var edgeOptions = new EdgeOptions();
var downloadDir = Path.Combine(Environment.CurrentDirectory, "InvoiceDownloads");
Directory.CreateDirectory(downloadDir);

// 设置自动下载参数
edgeOptions.AddUserProfilePreference("download.default_directory", downloadDir);
edgeOptions.AddUserProfilePreference("download.prompt_for_download", false);
edgeOptions.AddUserProfilePreference("plugins.always_open_pdf_externally", true); // 让PDF直接下载而非在浏览器打开

// 启动浏览器
var driver = new EdgeDriver(edgeOptions);

之后发票生成后会直接下载到指定目录,无需手动触发Ctrl+S。

方案2:修复AutoIt脚本(必须用另存为窗口时)

AutoIt无效大概率是窗口识别不准确,Edge的“另存为”窗口标题可能是“另存为”或英文“Save As”,需精准匹配并等待窗口激活:

  1. 编写AutoIt脚本并编译为exe:
WinWaitActive("另存为", "", 10) ; 等待窗口激活,超时10秒
Send("test.pdf") ; 输入文件名
Send("{ENTER}") ; 确认保存
  1. 在C#中调用,注意要在Ctrl+S后等待窗口出现再执行:
// 切换到目标标签页(先确认窗口正确性)
foreach (var handle in driver.WindowHandles)
{
    driver.SwitchTo().Window(handle);
    if (driver.Title.Contains("发票") || driver.Url.Contains("invoice")) // 根据实际标题/URL调整
    {
        break;
    }
}

// 触发Ctrl+S
Actions savePDF = new Actions(driver);
savePDF.KeyDown(Keys.Control).SendKeys("s").KeyUp(Keys.Control).Build().Perform();

// 调用AutoIt编译后的exe执行保存操作
System.Diagnostics.Process.Start(@"C:\Path\To\Your\SaveAsScript.exe");

方案3:确认窗口切换正确性

即使发票标签页已聚焦,也建议通过标题/URL定位窗口,避免WindowHandles[1]的顺序问题:

// 遍历窗口找到目标标签页
foreach (var handle in driver.WindowHandles)
{
    driver.SwitchTo().Window(handle);
    if (driver.Title.Contains("发票")) // 替换为实际发票页面的标题特征
    {
        break;
    }
}

额外优化建议

  • 替换Thread.Sleep(4000)为显式等待,确保页面加载完成:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d => d.ExecuteScript("return document.readyState").ToString() == "complete");

内容的提问来源于stack exchange,提问作者JavaJunior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:25:34