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

如何用Selenium C#通过链接下载PDF(后端改为多POST请求)

解决方案思路与实现

思路一:抓包分析并模拟完整POST请求链

后端改成多步POST请求后,你需要先理清每个请求的依赖关系:

  • 打开浏览器F12→Network面板,勾选「Preserve log」,点击PDF链接,记录所有触发的POST请求。
  • 查看每个请求的URL、请求头(Cookie、Content-Type等)、请求体(Form Data/JSON),以及响应中是否包含后续请求需要的参数(比如token、session标识)。

用HttpClient模拟请求链,通过CookieContainer维持会话一致性:

using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.IO;

public async Task DownloadPdfViaPostChain()
{
    var downloadPath = @"C:\Users\Downloads\target.pdf";
    var cookieContainer = new CookieContainer();
    
    // 初始化HttpClient并绑定Cookie容器
    using (var handler = new HttpClientHandler { CookieContainer = cookieContainer })
    using (var client = new HttpClient(handler))
    {
        // 1. 发送第一个POST请求(替换为你抓包到的实际参数和URL)
        var firstPostData = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("param1", "your-value1"),
            new KeyValuePair<string, string>("param2", "your-value2")
        });
        var firstResponse = await client.PostAsync("https://your-api-domain/first-step", firstPostData);
        firstResponse.EnsureSuccessStatusCode();
        
        // 从Cookie或响应体提取后续请求需要的参数(示例:提取session token)
        var sessionToken = cookieContainer.GetCookies(new Uri("https://your-api-domain"))["session_token"].Value;
        
        // 2. 发送第二个POST请求获取PDF流(替换为实际请求信息)
        var secondPostData = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("session_token", sessionToken),
            new KeyValuePair<string, string>("pdf_id", "target-pdf-id")
        });
        var pdfResponse = await client.PostAsync("https://your-api-domain/final-pdf-step", secondPostData);
        pdfResponse.EnsureSuccessStatusCode();
        
        // 3. 将PDF流保存到本地
        using (var stream = await pdfResponse.Content.ReadAsStreamAsync())
        using (var fileStream = new FileStream(downloadPath, FileMode.Create))
        {
            await stream.CopyToAsync(fileStream);
        }
    }
}

思路二:配置浏览器驱动自动下载PDF(新手友好)

如果不想模拟复杂的请求链,可以直接配置ChromeDriver,让PDF链接点击后自动下载而非在新窗口预览:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

public void DownloadPdfViaBrowser()
{
    var downloadPath = @"C:\Users\Downloads";
    var options = new ChromeOptions();
    
    // 配置Chrome自动下载PDF,禁用预览
    options.AddUserProfilePreference("download.default_directory", downloadPath);
    options.AddUserProfilePreference("download.prompt_for_download", false);
    options.AddUserProfilePreference("plugins.always_open_pdf_externally", true);
    
    // 初始化驱动并执行操作
    using (var driver = new ChromeDriver(options))
    {
        // 先完成登录(确保会话有效)
        driver.Navigate().GoToUrl("https://your-login-page.com");
        // ... 这里补充你的登录代码(输入账号密码、点击登录等)
        
        // 点击PDF链接触发下载
        var pdfLink = driver.FindElement(By.XPath("your-pdf-link-xpath"));
        pdfLink.Click();
        
        // 等待下载完成(可根据文件是否存在优化等待逻辑,示例等待5秒)
        System.Threading.Thread.Sleep(5000);
    }
}

现有代码的问题修正

你当前的代码存在几个语法错误:

  • 路径未转义:"C:\Users\Downloads" 需改为 @"C:\Users\Downloads" 或 "C:\\Users\\Downloads",避免转义字符解析错误。
  • WebClient Headers写法错误:webClient.Headers("User-Agent:...") 应改为 webClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36")。
  • 缺少分号:webClient.DownloadFile(EndPoint, flnm) 末尾需要添加;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:35:23