Acceso a Links utilizando Selenium WebDriver

Acceso a links utilizando Selenium WebDriver

En este tutorial, aprenderemos los métodos disponibles para encontrar y acceder a los links disponibles en una aplicación/página web usando webdriver. Además, discutiremos algunos de los problemas comunes que se enfrentan al acceder a los enlaces y discutiremos más sobre cómo resolverlos.

Esto es lo que aprenderás:

Accediendo a los Links

  • Coincidencia exacta
  • Coincidencia parcial
  • Mayúsculas y minúsculas
  • Todos los Links
  • Links fuera y dentro de un bloque
  • Acceder a Links de imágenes

Links que coincidan con un criterio 

Se puede acceder a los links/enlaces utilizando una coincidencia exacta o parcial de su texto de enlace. Los ejemplos que aparecen a continuación proporcionan escenarios en los que existirían múltiples coincidencias y explicarían cómo se ocuparían de ellos.

Links coincidencia exacta

El acceso a los vínculos/links/enlaces mediante su texto de vínculo exacto se realiza mediante el método By.linkText(). Sin embargo, si hay dos enlaces que tienen el mismo texto de enlace, este método sólo tendrá acceso a la primera. Considere el código HTML de abajo.

WebDriver al ejecutar el código a continuación, accede al primer Link «click here»

Código:

import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;		

public class MyClass {				
    		
    public static void main(String[] args) {									
        String baseUrl = "http://demo.guru99.com/test/link.html";	
        //Tener en cuenta que "G:\\chromedriver.exe" hace referencia a donde tengo ubicado el webdriver de chrome		
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        driver.get(baseUrl);					
        driver.findElement(By.partialLinkText("here")).click();					
        System.out.println("Title of page is: " + driver.getTitle());							
        driver.quit();			
    }		
}

Así es como funcionalink_selenium

Como resultado, se le llevará automáticamente a Google.

NOTA: recuerda que si aún no sabes como localizar elementos de la web. Tenemos nuestro tutorial Localizar elementos con Selenium WebDriver

Links coincidencia parcial

El acceso a los links/vínculos mediante una parte de su texto de vínculo se realiza mediante el método By.partialLinkText (). Si especifica un texto de vínculo parcial que tiene varias coincidencias, sólo se tendrá acceso a la primera coincidencia. Considere el código HTML abajo.

Cuando webdriver ejecuta el código a continuación, todavía será llevado a Google.

Código:

import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;		

public class P1 {				
    		
    public static void main(String[] args) {									
        String baseUrl = "http://demo.guru99.com/test/link.html";					
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        driver.get(baseUrl);					
        driver.findElement(By.partialLinkText("here")).click();					
        System.out.println("Title of page is: " + driver.getTitle());							
        driver.quit();			
    }		
}

Cómo obtener enlace que no sea el primero

Así que, ¿cómo evitar o moverse sobre el problema anterior? En los casos en que hay varios enlaces con el mismo texto de enlace, y queremos tener acceso a los enlaces que no sea el primero, ¿cómo vamos a hacerlo?

En tales casos, en general, se utilizan diferentes localizadores… By.xpath(), By.cssSelector() o By.tagName().

El uso más común es By.xpath(). Es la más fiable pero parece compleja y no legible.

Links con mayúsculas y minúsculas

links_mayusculas selenium

Los parámetros de By.linkText() y By.partialLinkText() distinguen entre mayúsculas y minúsculas, lo que significa que la capitalización importa. Por ejemplo, en la Página principal de Mercury Tours, hay dos enlaces que contienen el texto «egis»-uno es el enlace de «REGISTER» que se encuentra en el menú superior, y el otro es el enlace «Register here» que se encuentra en la parte inferior derecha de la página.

links en selenium webdriver

Aunque ambos enlaces contienen los caracteres «egis», uno es el método «By.partialLinkText()» tendrá acceso a estos dos enlaces por separado dependiendo de la capitalización de los caracteres. Vea el código de ejemplo abajo.

Código:

public static void main(String[] args) {								
        String baseUrl = "http://demo.guru99.com/selenium/newtours/";					
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        driver.get(baseUrl);					
        String theLinkText = driver.findElement(By					
                .partialLinkText("egis"))			
                .getText();		
        System.out.println(theLinkText);					
        theLinkText = driver.findElement(By					
                .partialLinkText("EGIS"))			
                .getText();		
        System.out.println(theLinkText);					

        driver.quit();			

    }

 

Todos los enlaces

Uno de los procedimientos comunes en las pruebas Web es probar si todos los links presentes en la página están funcionando. Esto se puede hacer convenientemente usando una combinación de Java for-each Loop, findElements() & By.tagName(«a»).

El método findElements() devuelve una lista de elementos Web con la etiqueta a. mediante un bucle for-each, se accede a cada elemento.

links_selenium

El código web que aparece a continuación comprueba cada enlace de la Página principal de Mercury Tours para determinar los enlaces que están ya terminados y funcionando y los que aún están en construcción.

NOTA: Recuerda que si presentas la excepción «no such element exception» puedes solucionarlo con Waits o esperas en selenium webdriver

import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;		
import java.util.List;		
import java.util.concurrent.TimeUnit;		
import org.openqa.selenium.*;		

public class P1 {				
    		
    public static void main(String[] args) {	
        //Url en la que realizaremos la prueba								
        String baseUrl = "http://demo.guru99.com/selenium/newtours/";
          
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();
          
        //Titulo de la página en construcción		
        String underConsTitle = "Under Construction: Mercury Tours";					
  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);					
        driver.get(baseUrl);	
  
        //Obtiene todos los enlaces de la pagina y los devuelve en una lista WebElement 			
        List<WebElement> linkElements = driver.findElements(By.tagName("a"));							
        String[] linkTexts = new String[linkElements.size()];							
  int i = 0;					

  //extraer los textos del enlace de cada elemento Link		
  for (WebElement e : linkElements) {							
      linkTexts[i] = e.getText();							
      i++;			
        }		
  //probar cada enlace		
  for (String t : linkTexts) {							
      driver.findElement(By.linkText(t)).click();					
      if (driver.getTitle().equals(underConsTitle)) {							
                System.out.println("\"" + t + "\""								
                        + " is under construction.");			
            } else {			
                System.out.println("\"" + t + "\""								
                        + " is working.");			
            }		
  driver.navigate().back();			
        }		
  driver.quit();			
    }		
}

 

La salida en consola debe ser similar a la que se indica a continuación.

Links fuera y dentro de un bloque

El último estándar de HTML5 permite que las etiquetas <a> se coloquen dentro y fuera de las etiquetas de nivel de bloque como <div>, <p>, o <h3>. Los métodos «By.linkText()» y «By.partialLinkText()» pueden tener acceso a un vínculo situado fuera y dentro de estos elementos de nivel de bloque. Considere el código HTML abajo.

El código webdriver que aparece a continuación tiene acceso a ambos enlaces mediante el método By.partialLinkText().

Código:

import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;		

public class MyClass {				
    		
    public static void main(String[] args) {									
        String baseUrl = "http://demo.guru99.com/test/block.html";					
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        driver.get(baseUrl);					
        driver.findElement(By.partialLinkText("Inside")).click();					
        System.out.println(driver.getTitle());					
        driver.navigate().back();			
        driver.findElement(By.partialLinkText("Outside")).click();					
        System.out.println(driver.getTitle());					
        driver.quit();			
    }		
}

 

La salida anterior confirma que ambos Links se accedieron satisfactoriamente porque sus respectivos títulos de página se recuperaron correctamente.

Acceso a enlaces de imágenes

Los enlaces/links de imagen son los vínculos de las páginas web representados por una imagen que, al hacer clic, navega a una ventana o página diferente.

Dado que son imágenes, no podemos utilizar los métodos By.linkText() y By.partialLinkText() porque los links de las imágenes básicamente no tienen ningún texto de vínculo.

En este caso, debemos recurrir al uso de By.cssSelector o By.xpath. El primer método es más preferido por su simplicidad.

En el siguiente ejemplo, accederemos al logotipo de «Facebook» en la parte superior izquierda de la página de recuperación de contraseñas de Facebook.

link_image_selenium

Utilizaremos By.cssSelector y el atributo «title» del elemento para acceder al vínculo de imagen. Y luego vamos a verificar si nos llevaron a la Página principal de Facebook.

import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;		

public class MyClass {				
    		
    public static void main(String[] args) {									
        String baseUrl = "https://www.facebook.com/login/identify?ctx=recover";					
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        driver.get(baseUrl);					
        //Clic en el logo de Facebook		
  driver.findElement(By.cssSelector("a[title=\"Go to Facebook home\"]")).click();					

  //Compruebe que ahora estamos de vuelta en la Página principal de Facebook		
  if (driver.getTitle().equals("Facebook - log in or sign up")) {							
            System.out.println("We are back at Facebook's homepage");					
        } else {			
            System.out.println("We are NOT in Facebook's homepage");					
        }		
  driver.close();		

    }		
}

 

Resultado:

Resumen

  • Se accede a los Links mediante el método click().
  • Además de los localizadores disponibles para cualquier WebElement, los enlaces también tienen localizadores basados en texto de enlace:
    • By.linkText() – localiza los links basándose en la coincidencia exacta del texto del vínculo proporcionado como parámetro.
    • By.partialLinkText() – localiza links basados en la coincidencia de texto parcial del texto del link.
  • Los dos localizadores anteriores son sensibles a las mayúsculas.
  • Si hay varias coincidencias, By.linkText() y By.partialLinkText() sólo seleccionará la primera coincidencia. En estos casos en los que existen varios enlaces con el mismo texto de enlace, se utilizan otros localizadores basados en XPath, CSS.
  • findElements() & By.tagName(«a») son métodos que encuentran todos los elementos de la página que coincidan con los criterios del localizador
  • Los Links pueden ser accedidos por el By.linkText () y By.partialLinkText () si están dentro o fuera de los elementos de nivel de bloque.
  • El acceso a los Links de imagen se realiza mediante métodos By.cssSelector() y By.xpath ().

Esto ha sido todo por esta entrada, espero les haya sido muy útil y hayan aprendido el manejo de links con Selenium WebDriver.

Recuerden visitar nuestro Tutorial Selenium WebDriver

Recomiendo visitar How to access links using selenium webdriver

Compartir artículo

1 Comments

  1. Pingback: Acceder a elementos de una Tabla - Tutorial Selenium

Leave Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.