2017-06-22 23 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

謝謝你,做了一個魅力 –