2011-01-07 32 views

Trả lời

5

Tôi không nghĩ rằng bạn có thể nhận thông tin nhị phân trực tiếp từ WatiN. Tuy nhiên, bạn có phương thức Image.Uri cung cấp cho bạn URI của hình ảnh. Vì vậy, sau đó nó rất dễ dàng để tải về nó wih http yêu cầu.

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

Hope this helps

+2

Có, tôi có thể sử dụng điều này, nhưng với tất cả các yêu cầu hình ảnh đang thay đổi ... mã PHP tạo ra hình ảnh mới trên tất cả các yêu cầu, vì vậy tôi cần chính xác giống như trong WatiN. Có lẽ một số ràng buộc với IHtmlDocument hoặc một cái gì đó? –

+0

@Baptiste Pernet - Cảm ơn câu trả lời đã giải quyết được sự cố của tôi. Một lần nữa xin cảm ơn. :) – Bibhu

7

Tôi đã có một vấn đề tương tự một số thời gian trước đây. Watin không thể làm điều này trực tiếp nhưng nó cho thấy các đối tượng mshtml cần thiết để có được một số kết quả.

Vào thời điểm đó mã của tôi là khá nhiều như thế này:

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

    } 
} 

ít hack này, về cơ bản, cố gắng sao chép các hình ảnh vào clipboard. Tuy nhiên tôi đã có một vài vấn đề làm cho nó hoạt động đúng và kết thúc chụp nhanh khu vực xung quanh hình ảnh và lưu nó vào đĩa.

Mặc dù điều này có thể không thể rất hữu ích nó có thể chỉ cho bạn một số hướng ..

+0

Thx, tôi sẽ thử khi tôi trở về từ kỳ nghỉ và có thể đăng kết quả của mình. –

+1

có một ngoại lệ bảo mật trong IE. bất kỳ ý tưởng làm thế nào để giải quyết điều này? cảm ơn – kakopappa

+0

Nó sẽ không hoạt động cho Firefox, bạn có giải pháp nào cho firefox không? CaptureWebPageToFile cũng tạo ra hình ảnh màu đen –

0

Tôi có vấn đề như vậy, và tôi không thể giải quyết nó. PHP tạo ra hình ảnh mới tất cả các thời gian vì vậy tôi đã sử dụng phương pháp 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; 
    } 

Đó là phương pháp tôi sử dụng cho hình ảnh được tạo php. Nó được tích hợp trong WebBrowserClass của riêng tôi, mở rộng điều khiển trình duyệt web.

(như vậy "này" = WebBrowser)

Nhưng chúng ta phải nhập khẩu các giao diện IHTMLElementRender2, sử dụng phương pháp này.

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

Tôi tìm thấy phương pháp này trên web, khoảng 1 năm trước, vì vậy nếu bạn tìm kiếm nó, bạn có thể tìm thêm thông tin.

Iwan

+0

Nó thậm chí có thể nắm bắt toàn bộ nội dung của một phần tử div. Vì vậy, nó không chỉ làm việc với các yếu tố hình ảnh. ;) – Iwan1993

+0

Dường như không hoạt động với tôi - 'Element.style.width' là' null': ( –

+0

Phụ thuộc vào yếu tố của bạn. Bạn có thể thử nghiệm nó bằng cách sử dụng phần tử "q" nổi tiếng của google. – Iwan1993

1

Một thời gian trước, tôi cần thiết để trích xuất dữ liệu hình ảnh quá nên tôi đi kèm với giải pháp này:

Tạo một lĩnh vực ẩn và vải bên trong trang sử dụng

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

biến nó để base64 sử dụng javascript và truy xuất giá trị của nó

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();"); 

rồi lấy giá trị hệ thống hóa

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

Hy vọng nó sẽ giúp :)

Các vấn đề liên quan