如何使用phantomJS捕获文件下载

时间:2017-06-22 13:45:27

标签: c# selenium phantomjs

我正在尝试在登录后受保护的页面上下载文件。我遇到的问题是,一旦我获得了下载URL,该文件需要在PhantomJS中下载才能拥有活动会话。下载是通过javascript完成的。我点击一个网址,它将我带到一个临时页面,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和硒。

1 个答案:

答案 0 :(得分: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;
    }
}