我正在尝试在登录后受保护的页面上下载文件。我遇到的问题是,一旦我获得了下载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和硒。
答案 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;
}
}