10 consejos y trucos avanzados de WebDriver

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

 

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP