2012-07-17 22 views
8

Estoy tratando de capturar una captura de pantalla de toda la pantalla del navegador (por ejemplo, con cualquier barra de herramientas, paneles, etc.) no solo una página completa, así que estoy código:Obtener Window handle (IntPtr) de Selenium webdriver ventana actual 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"); 
} 

Respuesta

3

usted podría obtener el identificador de ventana utilizando 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); 
     // ... 
    } 
} 

Por supuesto, esto supone que tiene una única instancia de navegador con ese título específico.

+0

Buen truco, por cierto, pero si hay dos diferentes instancias de Firefox con el mismo título? – kseen

+0

@kseen Puede reemplazar ['FirstOrDefault'] (http://msdn.microsoft.com/en-us/library/bb549039) con [' SingleOrDefault'] (http://msdn.microsoft.com/en-us/library/bb549274), de modo que si hay dos aplicaciones de navegador diferentes con el mismo título, obtendrá una excepción. Si está en un caso de prueba, puede afirmarlo. –

+0

@PaoloMoretti ¿cómo puedo obtener el control de la ventana actual (ventana existente que se abre manualmente) que no está abierto por el controlador significa que no puedo usar driver.getWindowHandle(); –

2

Just and idea for hack. Puede usar los métodos de reflexión para obtener el proceso de la instancia de Firefox. En primer lugar declarar la clase FirefoxDriverEx heredado de FirefoxDriver - para acceso protegido propiedad binaria que encapsula instancia de proceso:

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

de lo que puede conseguir instancia de proceso para el acceso a MainWindowHandle propiedad

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

¿Podría agregar otros métodos para buscar ventanas que no sean los navegadores FireFox, p. IE, Chrome, Safari en Selenio? El problema es que no puedo encontrar 'ChromeBinary' o algo así como' FireFoxBinary'. – kseen

+0

Este método no es adecuado para IE o Chrome porque en esos casos los procesos del navegador controlan por servicios externos de selenio como IEDriverServer.exe y chromedriver.exe. Este método simplemente piratea y trabaja 'como está'. Para encontrar el método de trabajo, puede consultar las fuentes del controlador de selenio y probablemente crear sus propias versiones. – necrostaz

+0

Entonces, ¿existe un solo método de robuts para obtener un control de la ventana del navegador y esto es encontrar una ventana usando WinAPI por el título parcial de la ventana? – kseen

0

Fuera de la caja, el selenio no lo hace exponer el id. de proceso del conductor o el navegador, pero es posible. A continuación se muestra la lógica para conseguir hwnd

  • Cuando se inicializa conductor, Obtenga la dirección del cubo y extraer el número de puerto
  • De número de puerto, encontrar el identificador de proceso que está utilizando este puerto para la escucha, es decir. PID del controlador
  • Después de la navegación, de todas las instancias de iexplore encontrar el PID padre coincide con el pid del controlador, es decir, el pid del navegador.
  • Obtenga el Hwnd del navegador pid una vez que encuentre el navegador hwnd, puede usar win32 api para llevar el selenio a primer plano.

no es posible publicar el código completo aquí, la solución completa de trabajo (C#) para llevar navegador delante está en mi blog

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

Cuestiones relacionadas