<style>.lazy{display:none}</style>Поиск элементов по тексту ссылки в Selenium

Поиск элементов по тексту ссылки в Selenium

Идентификация гиперссылок на веб-странице в Selenium осуществляется по тексту ссылки. В этой статье мы рассмотрим доступные методы поиска и доступа к ссылкам с помощью WebDriver. Кроме того, разберем некоторые распространенные проблемы, возникающие при доступе к ссылкам, и способы их решения.

Примечание редакции: возможно, вас заинтересует статья “Как найти битые ссылки в Selenium”.

Содержание

БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"

Доступ к ссылкам с использованием их точного текста осуществляется с помощью метода By.linkText(). Однако если имеются две ссылки с одинаковым текстом, этот метод получит доступ только к первой из них.

Рассмотрим приведенный ниже HTML-код:

Пример HTML-кода, в котором есть две разные ссылки с текстом "Click here"
Две разные ссылки с текстом "click here": одна ведет на google, другая на facebook.

При запуске приведенного ниже кода WebDriver происходит переход по первой ссылке “click here”.

Фрагмент кода, приведенного ниже. Стрелка указывает на click here

Код:

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";					
        System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe");					
        WebDriver driver = new ChromeDriver();					
        		
        driver.get(baseUrl);					
        driver.findElement(By.linkText("click here")).click();					
        System.out.println("title of page is: " + driver.getTitle());							
        driver.quit();			
    }		

}

Как это работает:

В строке driver.findElement(By.linkText("click here")).click(); findElement() находит ссылки на странице, а метод .click() служит для доступа к ним.

В результате происходит автоматический переход на страницу Google.

Сообщение в консоли: "Title of page is: Google".

Доступ к ссылкам с использованием части их текста осуществляется с помощью метода By.partialLinkText(). Если указать частичный текст ссылки, который имеет несколько совпадений, то доступ будет осуществляться только к первому.

Рассмотрим приведенный ниже HTML-код:

В HTML-коде есть две ссылки: "go here" ведет на Google, а "Click here" ведет на Facebook
Вид двух ссылок, go here и click here, в браузере

При выполнении приведенного ниже кода WebDriver по-прежнему будет осуществляться переход на сайт Google (эта ссылка встречается на странице первой).

Код:

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

Как же обойти описанную выше проблему? Если имеется несколько ссылок с одинаковым текстом и мы хотим получить доступ не только к первой, то как это сделать?

В таких случаях, как правило, используются различные локаторы, например, By.xpath(), By.cssSelector() или By.tagName().

Наиболее часто используется By.xpath(). Это самый надежный вариант, но он выглядит сложным и нечитаемым.

Что такое чувствительность к регистру? link != LINK

Параметры для By.linkText() и By.partialLinkText() чувствительны к регистру. Например, на главной странице сайта компании Mercury Tours есть две ссылки, содержащие текст “egis”: одна из них – ссылка “REGISTER”, расположенная в верхнем меню, а другая – ссылка “Register here”, расположенная в правой нижней части страницы.

Вид ссылок в меню и правой нижней части страницы

Хотя обе ссылки содержат последовательность символов “egis”, метод By.partialLinkText() будет обращаться к этим двум ссылкам по отдельности в зависимости от регистра символов.

Рассмотрим пример кода ниже:

Фрагмент кода, приведенного ниже, сопоставленный с видом ссылок в консоли. Из кода к ссылкам в консоли идут стрелки: от .partialLinkText("egis")) - к Register here, а от .partialLinkText("EGIS")) - к REGISTER.

Код:

public static void main(String[] args) {								
        String baseUrl = "http://demo.guru99.com/test/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();			

    }

Последний стандарт HTML5 позволяет размещать теги <a> как внутри, так и снаружи блочных элементов <div>, <p>, или <h3>.
Методы By.linkText() и By.partialLinkText() позволяют получить доступ к ссылке, расположенной как внутри, так и снаружи этих блочных элементов.

Рассмотрим приведенный ниже HTML-код:

HTML-код. Ссылка с текстом "Inside a block-level tag." ведет на Google. Ссылка "Outside a block-level tag." ведет на Facebook.
Вид двух ссылок в браузере

В приведенном ниже коде WebDriver доступ к обеим ссылкам осуществляется с помощью метода By.partialLinkText():

Фрагмент кода, приведенного ниже, сопоставленный с видом  консоли. От строки driver.findElement(By.partialLinkText("Inside")).click(); красная стрелка ведет к слову Google в консоли. От строки driver.findElement(By.partialLinkText("Outside")).click(); зеленая стрелка ведет к "Welcome to 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 = "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();			
    }		
}	

Приведенный результат подтверждает, что доступ к обеим ссылкам был осуществлен успешно, поскольку заголовки соответствующих страниц были получены правильно.

Выводы

  • Доступ к ссылкам осуществляется с помощью метода click().
  • Помимо локаторов, доступных для любого веб-элемента, для ссылок также есть локаторы, основанные на их тексте:
    • By.linkText() – определяет местоположение ссылок на основе точного совпадения текста, заданного в качестве параметра, с их текстом
    • By.partialLinkText() – определяет местоположение ссылок на основе совпадения текста, заданного в качестве параметра, с частью тескста ссылки
  • Оба этих локатора чувствительны к регистру
  • При наличии нескольких совпадений функции By.linkText() и By.partialLinkText() выбирают только первое совпадение. В случаях, когда имеется несколько ссылок с одинаковым текстом, используются другие локаторы, основанные на xpath или CSS
  • Методы findElements() и By.tagName("a") находят на странице все элементы, соответствующие критериям локатора.
  • С помощью функций By.linkText() и By.partialLinkText() можно находить ссылки независимо от того, находятся ли они внутри или снаружи элементов блочного уровня.

Перевод статьи «Locate Elements by Link Text & Partial Link Text in Selenium».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *