Selenium,使用WebClient在IE中获取文件的例外

时间:2014-07-03 09:49:36

标签: internet-explorer selenium webclient setcookie webclient-download

我有一个Selenium测试应该下载一个文件并检查它是否包含某些内容。测试在Firefox和Chrome中运行正常,但在 IE 11 中我得到一个例外。

IE驱动程序:IEDriverServer版本2.41.0.0

代码:

<code>
 var driver = new InternetExplorerDriver();
 //....navigate and login to a page
 var el = driver.FindElements(By.PartialLinkText("Download File"))
                                             .First(p => p.GetAttribute("href").Contains("/downloadmyfile"));
 var link = el.GetAttribute("href");
 var client = new WebClient();
 client.Headers[HttpRequestHeader.Cookie] = CookieString();
 var data = client.DownloadString(new Uri(link));
</code>

复制Cookie的代码:

<code>
  public string CookieString()
    {
        var cookies = driver.Manage().Cookies.AllCookies;
        return string.Join("; ", cookies.Select(c => string.Format("{0}={1}", c.Name, c.Value)));
    }
</code>

例外:

  • 消息:基础连接已关闭:接收时发生意外错误。
  • InnerException:无法从传输连接读取数据:远程主机强行关闭现有连接。

用于Firefox驱动程序的driver.Manage()。Cookies.AllCookies:

ASP.NET_SessionId=sesionId222222; .authcookie=xxxxxxxx; __utma=1.559549671.1404381398.1404381398.1404381398.1; __utmb=1.1.10.1404381398; __utmc=1; __utmz=1.1404381398.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); testingSite=culture=en

用于IE驱动程序的driver.Manage()。Cookies.AllCookies:

__utma=1.342629986.1404310901.1404378456.1404381205.3; __utmb=1.2.10.1404381205; __utmc=1; __utmz=1.1404310901.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); testingSite=culture=en

对于同一网页,IE浏览器的浏览器cookie有sessionId和.authcookie。

任何人都有一个线索关于IE驱动程序可能出现什么问题?

我看到IE驱动程序不包含_SessionId和.authcookie的cookie值 有一种方法可以获取IE驱动程序丢失的cookie吗?

  • InnerException StackTrace:

      

    在System.Net.Sockets.NetworkStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)    在System.Net.FixedSizeReader.ReadPacket(Byte []缓冲区,Int32偏移量,Int32计数)     在System.Net.Security._SslStream.StartFrameHeader(Byte []缓冲区,Int32偏移量,Int32
      count,AsyncProtocolRequest asyncRequest)     在System.Net.Security._SslStream.StartReading(Byte []缓冲区,Int32偏移量,Int32
      count,AsyncProtocolRequest asyncRequest)     在System.Net.Security._SslStream.ProcessRead(Byte []缓冲区,Int32偏移量,Int32计数,   AsyncProtocolRequest asyncRequest)     在System.Net.TlsStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)     在System.Net.PooledStream.Read(Byte []缓冲区,Int32偏移量,Int32大小)     在System.Net.Connection.SyncRead(HttpWebRequest请求,布尔userRetrievedStream,   Boolean probeRead)

    • 异常StackTrace:
-at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
 at System.Net.WebClient.DownloadString(Uri address)
 at MyClasss........

1 个答案:

答案 0 :(得分:1)

这是因为IE不返回HttpOnly cookie。 ASP.NET SessionID是一个HttpOnly cookie。

我们找不到任何解决方案,因此我们切换到使用我们注入页面的JavaScript-AJAX请求执行下载。我们还将结果作为编码字符串返回给Selenium,因此我们不会使用下载的文件向HDD发送垃圾邮件。