2011-01-07 21 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); 
       } 

希望它能幫助:)