2017-06-22 24 views
0

我试图在登录后受保护的页面上下载文件。我遇到的问题是,一旦我获得下载网址,该文件需要在PhantomJS内部下载才能进行活动会话。使事情变得更复杂的下载是由JavaScript完成的。我点击一个网址,它将我带到一个临时页面,JavaScript开始下载并关闭页面。这是一个粗略的图解释人们需要做什么来下载文件。如何使用幻影捕获文件下载js

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

我以为我将能够使用正常的C#代码来下载此文件,但它不工作,因为它没有检测到活动会话,并将我重定向到登录。

这听起来像是一个饼干问题!


这里有一个IWebDriver扩展方法,其中插入所有IWebDriver饼干为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; 
    } 
} 
+0

谢谢你,做了一个魅力 –