2011-01-07 17 views

回答

5

我不认为你可以直接从WatiN获取二进制信息。但是,您有Image.Uri方法会为您提供图像的URI。那么很容易就可以通过http请求下载它。

using (Browser browser = new IE("http://www.sp4ce.net/computer/2011/01/06/how-to-use-WatiN-with-NUnit.en.html")) 
{ 
    Image image = browser.Images[0]; 
    Console.Write(image.Uri); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(image.Uri); 
    WebResponse response = request.GetResponse(); 
    using (Stream stream = response.GetResponseStream()) 
    using (FileStream fs = File.OpenWrite(@"c:\foo.png")) 
    { 
     byte[] bytes = new byte[1024]; 
     int count; 
     while((count = stream.Read(bytes, 0, bytes.Length))!=0) 
     { 
     fs.Write(bytes, 0, count); 
     } 
    } 
} 

希望这有助于

+2

是的,我可以用这一点,但每个请求的形象正在改变... PHP代码在每次请求生成新的形象,所以我需要完全和WatiN一样。也许一些绑定到IHtmlDocument什么的? – 2011-01-07 17:15:09

+0

@Baptiste Pernet - 谢谢你的回答,它解决了我的问题。再次感谢。 :) – Bibhu 2011-11-15 07:22:22

7

我前一段时间也有类似的问题。 Watin无法直接执行此操作,但它暴露了获取某些结果所需的mshtml对象。

当时我的代码是相当多这样的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using WatiN.Core; 
using WatiN.Core.Native.InternetExplorer; 
using mshtml; 
using System.Windows.Forms; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      Browser browser = new IE("http://www.google.com"); 
      IEElement banner = browser.Images[0].NativeElement as IEElement; 

      IHTMLElement bannerHtmlElem = banner.AsHtmlElement; 
      IEElement bodyNative = browser.Body.NativeElement as IEElement; 
      mshtml.IHTMLElement2 bodyHtmlElem = (mshtml.IHTMLElement2)bodyNative.AsHtmlElement; 
      mshtml.IHTMLControlRange controlRange = (mshtml.IHTMLControlRange)bodyHtmlElem.createControlRange(); 

      controlRange.add((mshtml.IHTMLControlElement)bannerHtmlElem); 
      controlRange.execCommand("Copy", false, System.Reflection.Missing.Value); 
      controlRange.remove(0); 

      if (Clipboard.GetDataObject() != null) 
      { 
       IDataObject data = Clipboard.GetDataObject(); 
       if (data.GetDataPresent(DataFormats.Bitmap)) 
       { 
        System.Drawing.Image image = (System.Drawing.Image)data.GetData(DataFormats.Bitmap, true); 
        // do something here 
       } 
      } 
     } 

    } 
} 

这个小黑客,基本上,试图将图像复制到剪贴板。不过,我遇到了一些问题,使其正常工作,并最终在图像周围快照区域并将其保存到磁盘。

虽然这可能不是非常有帮助的,可能你指出一些方向..

+0

Thx,我会尝试它,当我从假期回来,也许发布我的结果。 – 2011-01-13 11:18:00

0

我有这样的问题,我解决不了它。 PHP一直都会生成新的图像,所以我使用了CaptureWebPageToFile()方法。

2
public Image GetImageFromElement(IHTMLElement Element) 
    { 
     int width = (int)Element.style.width; 
     int height = (int)Element.style.height; 
     IHTMLElementRender2 render = (IHTMLElementRender2)Element; 

     Bitmap screenCapture = new Bitmap(width, height); 
     Rectangle drawRectangle = new Rectangle(0, 0, width, height); 
     this.DrawToBitmap(screenCapture, drawRectangle); 
     Graphics graphics = Graphics.FromImage(screenCapture); 

     IntPtr graphicshdc = graphics.GetHdc(); 
     render.DrawToDC(graphicshdc); 
     graphics.ReleaseHdc(graphicshdc); 
     graphics.Dispose(); 

     return screenCapture as Image; 
    } 

这就是我用于php生成图像的方法。 它在我自己的WebBrowserClass中实现,它扩展了webbrowser控件。

(所以“这个” = web浏览器)

但是,我们必须导入IHTMLElementRender2接口,使用的方法。

[Guid("3050f669-98b5-11cf-bb82-00aa00bdce0b"), 
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown), 
     ComVisible(true), 
     ComImport] 
    interface IHTMLElementRender2 
    { 
     void DrawToDC([In] IntPtr hDC); 
     void SetDocumentPrinter([In, MarshalAs(UnmanagedType.BStr)] string bstrPrinterName, [In] IntPtr hDC); 
    }; 

,我发现在网络这个方法,大约一年前,如果你搜索它你可能会发现更多的信息。

伊万

1

前一段时间,我需要提取的图像数据量太大,所以我想出了这个解决方案:

创建一个隐藏字段和帆布使用

ie.RunScript("document.body.innerHTML += \"<input type='hidden' id='hidden64'/>\";"); 
ie.RunScript("document.body.innerHTML += \"<canvas id='canv' width='150px' height='40px' ></canvas>\";"); 

改造它的页面内到base64使用JavaScript并检索其值

ie.RunScript("var c = document.getElementById('canv');"); 
ie.RunScript("var ctx = c.getContext('2d');"); 
ie.RunScript("var img = document.getElementsByName('imgCaptcha')[0];"); 
ie.RunScript("ctx.drawImage(img, 10, 10);"); 
ie.RunScript("document.getElementById('hidden64').value=c.toDataURL();"); 

然后检索编纂值

string data = ie.Element(Find.ById("hidden64")).GetAttributeValue("value"); 

var base64Data = Regex.Match(data, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value; 
       var binData = Convert.FromBase64String(base64Data); 
       Bitmap im; 
       using (var stream = new MemoryStream(binData)) 
       { 
        im = new Bitmap(stream); 
       } 

希望它能帮助:)