2011-01-07 10 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や何かにバインドするのでしょうか? –

+0

@Baptiste Pernet - 私の問題を解決した答えをありがとう。もう一度ありがとう。 :) – Bibhu

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、私は休日から戻って、多分私の結果を投稿するときにそれを試してみます。 –

+1

IEにセキュリティ例外があります。任意のアイデアをどのようにこれを解決するには?ありがとう – kakopappa

+0

それはFirefoxのために働くことはありません、あなたはfirefoxのための解決策がありますか? CaptureWebPageToFileも黒い画像を生成する –

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を拡張している私自身のWebBrowserClassに組み込まれています。

(いわゆる「この」= 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年前です。それを検索すると、より詳しい情報が見つかります。

イワン

+0

div要素の内容全体をキャプチャすることも可能です。したがって、画像要素だけでは機能しません。 ;) – Iwan1993

+0

「Element.style.width'はヌルです:( –

+0

あなたの要素に依存します。Googleの有名な「q」要素を使ってテストしてください。 – Iwan1993

1

は、しばらく前に私は、私は、このソリューションに付属しすぎて画像データを抽出するために必要な:hiddenフィールドを作成します

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

を使用して、ページ内のキャンバスは、それを変換しますjavascriptを使用してbase64にその値を取得すると

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); 
       } 

を取得すると、はい、私はこれを使用することができ

関連する問題