2012-07-17 40 views
8

Tôi đang cố gắng chụp ảnh màn hình của toàn bộ trình duyệt (ví dụ: với bất kỳ thanh công cụ, bảng điều khiển nào ...), không chỉ toàn bộ trang mã:Nhận cửa sổ xử lý (IntPtr) từ cửa sổ hiện tại của trình duyệt web Selenium GUID

using (FirefoxDriver driver = new FirefoxDriver()) 
{ 
    driver.Navigate().GoToUrl(url);     

    ScreenCapture sc = new ScreenCapture(); 

    // How can I find natural IntPtr handle of window here, using GUID-like identifier returning by driver.currentWindowHandle? 
    Image img = sc.CaptureWindow(...); 
    MemoryStream ms = new MemoryStream(); 
    img.Save(ms, ImageFormat.Jpeg); 
    return new FileStreamResult(ms, "image/jpeg"); 
} 

Trả lời

3

bạn có thể có được xử lý cửa sổ bằng Process.GetProcesses:

using (FirefoxDriver driver = new FirefoxDriver()) 
{ 
    driver.Navigate().GoToUrl(url); 

    string title = String.Format("{0} - Mozilla Firefox", driver.Title); 
    var process = Process.GetProcesses() 
     .FirstOrDefault(x => x.MainWindowTitle == title); 

    if (process != null) 
    { 
     var screenCapture = new ScreenCapture(); 
     var image = screenCapture.CaptureWindow(process.MainWindowHandle); 
     // ... 
    } 
} 

Điều này tất nhiên giả định rằng bạn có một trường hợp trình duyệt duy nhất với danh hiệu cụ thể.

+0

đẹp lừa, btw, nhưng nếu có hai khác nhau trường hợp của FireFox với cùng một tiêu đề? – kseen

+0

@kseen Bạn có thể thay thế [FirstOrDefault'] (http://msdn.microsoft.com/en-us/library/bb549039) bằng ['SingleOrDefault'] (http://msdn.microsoft.com/en-us/library/bb549274), để nếu có hai trình duyệt khác nhau có cùng tiêu đề, bạn sẽ nhận được một ngoại lệ. Nếu bạn đang ở trong một trường hợp thử nghiệm, bạn có thể khẳng định nó. –

+0

@PaoloMoretti làm cách nào tôi có thể xử lý cửa sổ hiện tại (Cửa sổ hiện tại được mở bằng tay) mà không được mở bằng trình điều khiển nghĩa là tôi không thể sử dụng driver.getWindowHandle(); –

2

Chỉ và ý tưởng để hack. Bạn có thể sử dụng các phương thức Reflection để có được quá trình của cá thể firefox. Đầu tiên tuyên bố lớp FirefoxDriverEx thừa hưởng từ FirefoxDriver - tiếp cận bảo vệ tài sản Binary mà gói gọn Process Ví dụ:

class FirefoxDriverEx : FirefoxDriver { 
     public Process GetFirefoxProcess() { 
      var fi = typeof(FirefoxBinary).GetField("process", BindingFlags.NonPublic | BindingFlags.Instance); 
      return fi.GetValue(this.Binary) as Process; 
     } 
    } 

hơn bạn có thể nhận quá trình dụ để truy cập vào tài sản

using (var driver = new FirefoxDriverEx()) { 
      driver.Navigate().GoToUrl(url); 

      var process = driver.GetFirefoxProcess(); 
      if (process != null) { 
       var screenCapture = new ScreenCapture(); 
       var image = screenCapture.CaptureWindow(process.MainWindowHandle); 
       // ... 
      } 
     } 
+0

Bạn có thể thêm một phương pháp khác để tìm cửa sổ không phải là trình duyệt FireFox, ví dụ: IE, Chrome, Safari trong Selenium? Vấn đề là tôi không thể tìm thấy 'ChromeBinary' hoặc somethibg khác như' FireFoxBinary'. – kseen

+0

Phương pháp này không phù hợp với IE hoặc Chrome vì trong những trường hợp đó, các quy trình của trình duyệt được kiểm soát bởi các dịch vụ selen ngoài như IEDriverServer.exe và chromedriver.exe. Phương pháp này chỉ hack và làm việc 'như là'. Để tìm phương pháp làm việc, bạn có thể xem xét các nguồn của trình điều khiển selen và có thể xây dựng các phiên bản của riêng bạn. – necrostaz

+0

Vì vậy, chỉ có một phương pháp robuts tồn tại để có được một xử lý của cửa sổ trình duyệt và điều này là tìm một cửa sổ bằng cách sử dụng WinAPI bởi tiêu đề một phần của cửa sổ? – kseen

0

MainWindowHandle Out of box, selen không lộ trình điều khiển quá trình id hoặc trình duyệt hwnd nhưng nó là có thể. Dưới đây là logic để có được hwnd

  • Khi lái xe được khởi tạo, lấy url cho trung tâm và trích xuất số cổng
  • Từ số cổng, tìm id quá trình được sử dụng cổng này để nghe, ví dụ. PID của trình điều khiển
  • Sau khi điều hướng, từ tất cả các trường hợp iexplore tìm thấy PID cha khớp với pid của trình điều khiển, tức là trình duyệt pid.
  • Nhận giá trị Hwnd của trình duyệt pid khi tìm thấy hwnd của trình duyệt, bạn có thể sử dụng win32 api để đưa selen lên nền trước.

của nó không thể gửi mã đầy đủ ở đây, giải pháp toàn lao động (C#) để mang lại trình duyệt trước được trên blog của tôi

http://www.pixytech.com/rajnish/2016/09/selenium-webdriver-get-browser-hwnd/

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