WebDriver es una herramienta para automatizar los test de aplicaciones Web. Provee un API muy sencilla de usar, que puede usarse desde JUnit, TestNG o desde un main al viejo estilo. WebDriver no depende de un core javascript embebido en el navegador (como Selenium), lo que hace que sea mucho más potente y consistente entre navegadores…. En esta ocasión os mostraré 10 trucos o consejos avanzados sobre WebDriver, así que, si os interesa el tema, abrocháos el cinturón.
Captura de pantalla
Puedes usar el siguiente método para tomar una captura de pantalla completa de tu navegador.
public void TakeFullScreenshot(IWebDriver driver, String filename) { Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot(); screenshot.SaveAsFile(filename, ImageFormat.Png); }
A veces, necesitas hacer una captura de un solo elemento
public void TakeScreenshotOfElement(IWebDriver driver, By by, string fileName) { // 1. Make screenshot of all screen var screenshotDriver = driver as ITakesScreenshot; Screenshot screenshot = screenshotDriver.GetScreenshot(); var bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray)); // 2. Get screenshot of specific element IWebElement element = driver.FindElement(by); var cropArea = new Rectangle(element.Location, element.Size); var bitmap = bmpScreen.Clone(cropArea, bmpScreen.PixelFormat); bitmap.Save(fileName); }
Primero, hacemos nuestra captura de pantalla, después localizamos al elemento específico por su localización y sus atributos de tamaños. Más tarde, el trozo rectangular encontrado se guarda como un mapa de bits.
Así es como se usan ambos métodos en test.
[TestMethod] public void WebDriverAdvancedUsage_TakingFullScrenenScreenshot() { this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.WaitUntilLoaded(); string tempFilePath = Path.GetTempFileName().Replace(".tmp", ".png"); this.TakeFullScreenshot(this.driver, tempFilePath); } [TestMethod] public void WebDriverAdvancedUsage_TakingElementScreenshot() { this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.WaitUntilLoaded(); string tempFilePath = Path.GetTempFileName().Replace(".tmp", ".png"); this.TakeScreenshotOfElement(this.driver, By.XPath("//*[@id='tve_editor']/div[2]/div[2]/div/div"), tempFilePath); }
Obtendremos un nombre de archivo temporal a través de la ruta de clase especial .NET. Por defecto, los archivos temporales son generados con la extensión .tmp, por ello los reemplazaremos con la extensión .png.
Obtener el HTML fuente de un WebElement
Puedes utilizar el método GetAttribute de la interfaz IWebElement para obtener el propio código HTML de un elemento específico.
[TestMethod] public void GetHtmlSourceOfWebElement() { this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.WaitUntilLoaded(); var element = this.driver.FindElement(By.XPath("//*[@id='tve_editor']/div[2]/div[3]/div/div")); string sourceHtml = element.GetAttribute("innerHTML"); Debug.WriteLine(sourceHtml); }
Ejecutar Javascript
Puedes utilizar la interfaz IJavaScriptExecutor para ejecutar Javascript a través de WebDriver
[TestMethod] public void ExecuteJavaScript() { this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.WaitUntilLoaded(); IJavaScriptExecutor js = driver as IJavaScriptExecutor; string title = (string)js.ExecuteScript("return document.title"); Debug.WriteLine(title); }
Este test cogerá el título de la ventana actual vía Javascript y lo imprimirá en la ventana de salida del debug.
Establecer el Page Load Timeout
Hay al menos tres métodos que se pueden utilizar para llevar a cabo esto.
En primer lugar puedes establecer el page load timeout del driver por defecto a través de la clase de opciones del WebDriver.
this.driver.Manage().Timeouts().SetPageLoadTimeout(new TimeSpan(0, 0, 10));
Puedes esperar a que la página se haya cargado vía javascript
private void WaitUntilLoaded() { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.Until((x) => { return ((IJavaScriptExecutor)this.driver) .ExecuteScript("return document.readyState").Equals("complete"); }); }
La tercera opción es esperar a que un elemento o elementos sea/n visible/s en la página.
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy( By.XPath("//*[@id='tve_editor']/div[2]/div[2]/div/div")));
Ejecutar Tests en un Headless Browser
PhantomJS es un headless WebKit scriptable desarrollado con la API de Javascript. Cuenta con soporte para varios estándares web: manipulación DOM, selectores CSS, JSON, Canvas y SVG. Con el fin de poder utilizar el PhantomJSDriver en tu código, primero tendrás que descargar estos binarios.
[TestMethod] public void ExecuteInHeadlessBrowser() { this.driver = new PhantomJSDriver(@"D:ProjectsPatternsInAutomation.TestsWebDriver.Series.TestsDrivers"); this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.WaitUntilLoaded(); IJavaScriptExecutor js = driver as IJavaScriptExecutor; string title = (string)js.ExecuteScript("return document.title"); Debug.WriteLine(title); }
Este test se ejecuta en solo 3 segundos a través de PhantomJSDriver. Es casi tres veces más rápido que con el FirefoxDriver.
Comprobar si un elemento está visible
Puedes utilizar la propiedad Displayed de la interfaz IWebElement
[TestMethod] public void ExecuteInHeadlessBrowser() { this.driver = new PhantomJSDriver (@"D:ProjectsPatternsInAutomation.TestsWebDriver.Series.TestsDrivers"); this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.WaitUntilLoaded(); IJavaScriptExecutor js = driver as IJavaScriptExecutor; string title = (string)js.ExecuteScript("return document.title"); Debug.WriteLine(title); }
Utilizar un perfil específico
Por defecto, WebDriver siempre te asigna un perfil limpio nuevo si utilizas el constructor por defecto de FirefoxDriver. Sin embargo, a veces es posible que desees ajustar el perfil, por ejemplo, para añadir extensiones, desactivar JavaScript, etc.
FirefoxProfileManager profileManager = new FirefoxProfileManager(); FirefoxProfile profile = profileManager.GetProfile("YourProfileName"); this.driver = new FirefoxDriver(profile);
Puedes hacer algo similar con la configuración del ChromeDriver
ChromeOptions options = new ChromeOptions(); // set some options DesiredCapabilities dc = DesiredCapabilities.Chrome(); dc.SetCapability(ChromeOptions.Capability, options); IWebDriver driver = new RemoteWebDriver(dc);
Deshabilitar Javascript
Puedes utilizar el código del punto 7 para establecer un nuevo perfil de Firefox. Después solo tienes que establecer el atributo javascript.enabled a false.
FirefoxProfileManager profileManager = new FirefoxProfileManager(); FirefoxProfile profile = profileManager.GetProfile("HARDDISKUSER"); profile.SetPreference("javascript.enabled", false); this.driver = new FirefoxDriver(profile);
Gestionar cookies
Con estos sencillos consejos podrás gestionar las cookies de un sitio web con WebDriver
Añadir una nueva cookie
Cookie cookie = new Cookie("key", "value"); this.driver.Manage().Cookies.AddCookie(cookie);
Obtener todas las cookies
var cookies = this.driver.Manage().Cookies.AllCookies; foreach (var currentCookie in cookies) { Debug.WriteLine(currentCookie.Value); }
Eliminar una cookie por su nombre
this.driver.Manage().Cookies.DeleteCookieNamed("CookieName");
Borrar todas las cookies
this.driver.Manage().Cookies.DeleteAllCookies();
Obtener una cookie por el nombre
var myCookie = this.driver.Manage().Cookies.GetCookieNamed("CookieName"); Debug.WriteLine(myCookie.Value);
Maximizar la ventana
Utiliza el método Maximize de la interfaz IWindow
[TestMethod] public void MaximizeWindow() { this.driver.Navigate().GoToUrl(@"http://automatetheplanet.com"); this.driver.Manage().Window.Maximize(); }