【问题标题】:How to capture a file download using phantomJS如何使用 phantomJS 捕获文件下载
【发布时间】:2017-11-25 20:12:48
【问题描述】:

我正在尝试在登录后受保护的页面上下载文件。我遇到的问题是,一旦我获得下载 url,就需要在 PhantomJS 中下载该文件才能进行活动会话。使事情变得更复杂的下载是由javascript完成的。我点击一个 url,它把我带到一个临时页面,javascript 开始下载,然后关闭页面。这是一个粗略的图表,用于解释人类下载文件需要做什么。

Login
  |
  V
Click Download
  |
  V
Browser redirect to /download?fileid=123
  |
  V
File automatically downloads when the page loads
  |
  V
Window closes automatically

我正在将“/download?fileid=123”存储在一个字符串中。我以为我可以使用普通的 C# 代码来下载这个文件,但它不起作用,因为它没有检测到活动会话并将我重定向到登录。

我需要能够告诉 PhantomJS 导航到这个下载 url,它才能捕获由 javascript 自动下载的文件。我已经执行了导航,但在调试时我看不到任何显示文件流或我可以访问的任何内容。

我可以捕获此文件下载吗?我正在使用 PhantomJS 和 selenium。

【问题讨论】:

    标签: c# selenium phantomjs


    【解决方案1】:

    我以为我可以使用普通的 C# 代码来下载这个文件,但它不起作用,因为它没有检测到活动会话并将我重定向到登录。

    这听起来像是 cookie 问题!


    这是一个IWebDriver 扩展方法,它将所有IWebDriver cookie 插入HttpWebRequest,并在给定的url 处下载文件。

    public static bool TryDownloadFile(this IWebDriver driver, string url, string fileName)
    {
        try
        {
            // create HttpWebRequest
            Uri uri = new Uri(url);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    
            // insert cookies
            request.CookieContainer = new CookieContainer();
            foreach (OpenQA.Selenium.Cookie c in driver.Manage().Cookies.AllCookies)
            {
                System.Net.Cookie cookie =
                    new System.Net.Cookie(c.Name, c.Value, c.Path, c.Domain);
                request.CookieContainer.Add(cookie);
            }
    
            // download file
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream responseStream = response.GetResponseStream())
            using (FileStream fileStream = File.Create(fileName))
            {
                var buffer = new byte[4096];
                int bytesRead;
    
                while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    fileStream.Write(buffer, 0, bytesRead);
                }
            }
    
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多