Estoy ejecutando la prueba Selenium WebDriver en una PC remota desde mi computadora portátil (cliente Java), usando RemoteWebDriver. Pero RemoteWebDriver no ha proporcionado una API de captura de pantalla para obtener directamente una captura de pantalla de una PC remota. Google buscó mucho pero parece que necesita usar Json API para obtenerlo directamente del servidor de RemoteWebDriver. ¿Alguien puede darme alguna instrucción sobre cómo hacer eso? Gracias.¿Cómo obtener una captura de pantalla del servidor RemoteWebDriver en lugar de FirefoxDriver local?
¿Cómo obtener una captura de pantalla del servidor RemoteWebDriver en lugar de FirefoxDriver local?
Respuesta
El RemoteWebDriver
se debe aumentar antes de que pueda utilizar la capacidad de captura de pantalla. Como ya ha descubierto, intentar lanzar sin aumentar los resultados en una excepción.
WebDriver driver = new RemoteWebDriver(...);
driver = new Augmenter().augment(driver);
((TakesScreenshot)driver).getScreenshotAs(...);
Aquí hay otra solución: https://groups.google.com/d/topic/selenium-users/NLHXlhPrADs/discussion
Creo que esta es la mejor manera:
public<T> Object getScreenshotAs(OutputType<T> outputType) {
Augmenter augmenter = new Augmenter();
TakesScreenshot ts = (TakesScreenshot) augmenter.augment(driver);
return ts.getScreenshotAs(outputType);
}
El RemoteWebDriver no implementa la TakesScreenShot y los métodos descritos aquí para emitir el instancia de RemoteWebDriver a TakesScreenShot causará una ClassCastException. Veré si puedo encontrar una solución ya que estoy interesado en hacer lo mismo.
El Augmenter "mejorará las interfaces implementadas por esta instancia de WebDriver si esa instancia es un RemoteWebDriver". Dependiendo de cómo esté configurado RemoteWebDriver y cómo se está ejecutando el servidor de selenio en el host remoto, es posible obtener una captura de pantalla usando org.openqa.selenium.remote.Augmenter.
He configurado el RemoteWebDriver para usar las capacidades DesiredCapabilities.htmlUnit() y esto da un ClassCastError. Si RemoteWebDriver está configurado con las capacidades de un controlador que implementa la interfaz TakesScreenshot, es posible que no se produzca una ClassCastException, aunque todavía no lo he probado.
Desde la interfaz TakesScreenshot, los conductores de implementación conocidos son: AndroidDriver, AndroidWebDriver, ChromeDriver, EventFiringWebDriver, FirefoxDriver, InternetExplorerDriver, IPhoneDriver, IPhoneSimulatorDriver y SafariDriver
¡He ejecutado esto usando un controlador de Firefox en el servidor y funciona! – gffny
yo era capaz de conseguir este trabajo ... He aquí lo que tiene que hacer:
1) Crear un nuevo archivo de clase en un directorio o en algún lugar Util
package com.util;
import java.net.URL;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.DriverCommand;
import org.openqa.selenium.remote.RemoteWebDriver;
public class ScreenShotRemoteWebDriver extends RemoteWebDriver implements TakesScreenshot {
public ScreenShotRemoteWebDriver(URL url, DesiredCapabilities dc) {
super(url, dc);
}
@Override
public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException {
if ((Boolean) getCapabilities().getCapability(CapabilityType.TAKES_SCREENSHOT)) {
return target.convertFromBase64Png(execute(DriverCommand.SCREENSHOT).getValue().toString());
}
return null;
}
}
2) Entonces ... que cada vez que inicia el RemoteWeDriver, reemplace con este código:
driver = new ScreenShotRemoteWebDriver(new URL(-PUT YOUR HUB URL HERE-),cap);
Las capturas de pantalla se almacenarán localmente.
Espero que esto ayude.
Woah cool. ¡Voy a intentar esto! –
Impresionante ... ¡déjame saber cómo funciona para ti! – zerotres
- 1. ¿Cómo puedo obtener la hora local del usuario en lugar de la hora del servidor?
- 2. cómo tomar una captura de pantalla del iPhone programáticamente?
- 3. Captura de pantalla del proceso en el Servicio de Windows
- 4. Captura de pantalla en Haskell?
- 5. Captura de pantalla del iPhone para ver
- 6. Captura de pantalla de la segunda pantalla
- 7. Selenium cuelga la instancia de FirefoxDriver
- 8. Android OpenGL Captura de pantalla
- 9. Captura de pantalla del sitio web, del lado del servidor, en un servidor alquilado de Linux, gratis
- 10. ¿Cómo puedo obtener la zona horaria del servidor local?
- 11. Tomar automáticamente una captura de pantalla del servidor x si el contenido de la ventana cambia
- 12. Captura de pantalla en android
- 13. Obtener captura de pantalla en Windows con Python?
- 14. Captura de pantalla de la pantalla actual
- 15. Obtenga una captura de pantalla de una página de ASP.Net
- 16. ¿Cómo tomar la captura de pantalla programáticamente?
- 17. Android: pantalla de captura del teléfono como una película
- 18. Cómo tomar una captura de pantalla con FireMonkey (multiplataformas)
- 19. Pantalla de captura
- 20. ¿Cómo tomar una captura de pantalla de una página web?
- 21. ¿Cómo puedo hacer una captura de pantalla en Windows PowerShell?
- 22. Cómo tomar una captura de pantalla en OpenGL
- 23. Captura de pantalla de Android a través del código
- 24. Obtenga una captura de pantalla de una aplicación específica
- 25. Captura de pantalla del navegador mediante JavaScript (u otra cosa)
- 26. Convertir URL en captura de pantalla (script)
- 27. HTML5 video captura de pantalla
- 28. ¿Cómo tomar una captura de pantalla con unidad HTML?
- 29. ¿Cómo se toma una "captura de pantalla" de un NSView?
- 30. ¿Cómo obtengo la dirección IP local del servidor usando PHP?
¿Puede decirnos por qué la capacidad de captura de pantalla no estaba integrada en el RemoteWebDriver? Me pregunto qué hace este paso extra en segundo plano. Por cierto, según los documentos, Augmenter es una función experimental y debe usarse con precaución. – testerjoe2