Как найти элемент по тексту в Selenium WebDriver
Поиск элемента по тексту в Selenium используется для поиска веб-элемента с использованием его текстового атрибута. Текстовое значение используется в основном, когда основные свойства идентификации элемента, такие как идентификатор или класс, являются динамическими по своей природе, что затрудняет поиск веб-элемента.
Иногда разработчики склонны группировать похожие веб-элементы с одинаковым идентификатором или одним и тем же классом вместе. Например, если у вас есть элемент с тегом Button, который имеет динамический идентификатор и имя класса, где идентификатор изменяется с «ID-3465-text1» на «ID-4434-textE2», а имя класса изменяется. с «ID-Class-text45» на «ID-Class-text73» при каждом новом сеансе.
В таких случаях становится очень трудно найти веб-элементы используя атрибут ID или Class, и именно здесь атрибут Text приходит на помощь при выполнении Автоматизированное тестирование Selenium.
Текстовое значение может быть полностью или частично сопоставлено, чтобы найти элемент. В этой статье о том, как найти элемент по тексту в Селен веб-драйвервы прочтете о том, как использовать атрибут Text для поиска любого элемента.
Давайте начнем!
Что такое найти элемент в селене?
Когда ты начнешь написание скрипта автоматизации Selenium, взаимодействие с веб-элементами становится вашим первым и очень важным шагом, потому что именно с веб-элементами вы играете в тестовом сценарии. Теперь взаимодействие с этими веб-элементами может произойти только в том случае, если вы идентифицируете их, используя правильный подход.
Метод Find Element в Selenium — это команда, которая помогает вам идентифицировать веб-элемент. Существует несколько способов, которыми Find Element обеспечивает уникальную идентификацию веб-элемента на веб-странице с помощью Веб-локаторы в Selenium например, идентификатор, имя, имя класса и т. д. Вот синтаксис поиска элемента в Selenium.
Синтаксис поиска элемента:
WebElement elementName= driver.findElement(By.<LocatorStrategy>("LocatorValue"));
Как показано в приведенном выше синтаксисе, эта команда принимает «По” в качестве аргумента и возвращает объект WebElement. “По” является локатором или объектом запроса и принимает стратегию локатора. Стратегия локатора может принимать следующие значения:
Я БЫ
Имя
Имя класса
Название тэга
Текст ссылки
Частичный текст ссылки
XPath
CSS-селектор
Что такое найти элемент по тексту в Selenium?
Мы видели в предыдущем разделе о поиске элемента в Selenium и его синтаксисе. Теперь вам должно быть интересно, как найти элемент по тексту в Selenium WebDriver.
Ответ заключается в использовании XPath в Селене!!
Интересно, как? Давайте посмотрим на разделы ниже.
Чтобы использовать текст, вам нужно будет использовать XPath в качестве стратегии локатора и текстовый атрибут элемента в значении локатора.
Базовый формат XPath в Selenium показан ниже.
XPath = //tagname[[@Attribute](
Однако, прежде чем мы начнем, важно понять два встроенных метода Selenium, которые в конечном итоге будут использоваться в findElement.
**text() **— Это встроенный в Selenium метод, который используется с XPath для поиска элемента на основе его точного текстового значения. Синтаксис использования text() с findElement:
WebElement ele = driver.findElement(By.xpath(«//
[text()=’text value’]))
2. содержит() — Подобно методу text(), contains() — это еще один встроенный метод, который используется с XPath. Однако это используется, когда мы хотим написать локатор на основе частичного совпадения текста. Синтаксис использования text() и contains() с findElement:
WebElement ele=driver.findElement(By.xpath(“//<tagName>[contains(text(),’textvalue’)]”))
Давайте теперь подробно прочитаем об этом.
Обратите внимание ConnectionClosedException возникало всякий раз, когда соединение между драйвером и клиентом было потеряно, и клиент отправляет запрос драйверу после отключения драйвера.
Как правило, это исключение больше связано с UnreachableBrowserException для веб-драйвера chomre и браузера Firefox, кроме Safari.
Найти элемент по тексту в Selenium для полного совпадения текста
Теперь, когда вы видели синтаксис использования text() в случае полного совпадения текста. В этом разделе о том, как найти элемент по тексту в Selenium, давайте рассмотрим это на примере.
Мы будем использовать Селеновая площадка предлагаемый LambdaTest для понимания того же. LambdaTest — это облачный кроссбраузерное тестирование платформа, поддерживающая Selenium Grid, предоставляющая решение для всех препятствий, с которыми вы сталкиваетесь при выполнении автоматизированного тестирования на локальном компьютере. Платформы автоматизации тестирования, такие как LambdaTest, предлагают Selenium Grid, состоящий из 3000+ онлайн-браузеры чтобы вы могли легко выполнять автоматизированное тестирование Selenium.
Вариант использования
Войдите в Selenium Playground.
Определите веб-элемент для демонстрационной ссылки Checkbox на вышеуказанной веб-странице, используя метод text().
Нажмите на нее и распечатайте заголовок страницы.
Реализация
Мы будем реализовывать случай, используя Селен с Java и используйте облачную Selenium Grid, предлагаемую LambdaTest, для выполнения нашего тестового примера.
Selenium Grid относится к настройке тестирования программного обеспечения, которая позволяет выполнять QA. параллельное тестирование через несколько браузеров и устройств с уникальными операционными системами. Когда вся настройка Selenium Grid доступна с использованием облачных серверов, это называется Облако Selenium Grid. Онлайн-сеть Selenium Grid поможет вам сосредоточиться на написании лучших тестовых сценариев Selenium, а не беспокоиться об обслуживании инфраструктуры.
Давайте теперь проверим локатор демо-страницы Checkbox. Чтобы проверить, вы можете просто щелкнуть правой кнопкой мыши веб-элемент и выбрать «Проверить». На вкладке Элементы вы можете начать писать свой локатор.
Как показано на рисунке выше, мы используем демонстрационный текст флажка с его тегом a для полного совпадения, и, следовательно, правильная реализация здесь будет такой:
WebElement checkbox= driver.findElement(By.xpath(“//a[text()=’Checkbox Demo’]”))
Давайте теперь воспользуемся тем же и напишем наш тестовый пример.
Вы можете обратиться к приведенному ниже тестовому примеру.
package LambdaTest;
import org.openqa.Selenium.By;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.remote.DesiredCapabilities;
import org.openqa.Selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
[@Listeners](
class AutomationUsingFindElementByText {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "[@hub](
[@BeforeTest](
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "96.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "AutomationUsingFindElement");
capabilities.setCapability("name", "AutomationUsingFindElementSuite");
try {
driver = new RemoteWebDriver(new URL(" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
[@Test](
public void findElementByCompleteTextMatch() {
try {
System.out.println("Logging into Lambda Test Selenium Playground");
driver.get("[
WebElement checkBoxDemoPage= driver.findElement(By.xpath("//a[text()='Checkbox Demo']"));
checkBoxDemoPage.click();
System.out.println("Clicked on the Checkbox Demo Page");
WebElement header=driver.findElement(By.xpath("//h1"));
System.out.println("The header of the page is:"+header.getText());
} catch (Exception e) {
}
}
[@AfterTest](
public void closeBrowser() {
driver.close();
System.out.println("The driver has been closed.");
}
}
Вы можете использовать приведенный ниже файл testng.xml для запуска вышеуказанного тестового примера.
And the below pom.xml file for installing all the necessary dependencies.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="[
xmlns:xsi="[
xsi:schemaLocation="[ [
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>LambdaTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.Seleniumhq.Selenium</groupId>
<artifactId>Selenium-api</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.Seleniumhq.Selenium</groupId>
<artifactId>Selenium-remote-driver</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.Seleniumhq.Selenium</groupId>
<artifactId>Selenium-chrome-driver</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>4.4.3</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
Code Walkthrough
In this section on how to find element by text in Selenium, let’s look at the different areas of code in detail.
- Imported Dependencies: Here, we have imported all the necessary classes of Selenium WebDriver, WebDriverWait, Desired Capabilities, and RemoteWebDriver to set the respective browser capabilities and run the test cases on the grid.
2. Global Variables: As we have used a Selenium Grid Cloud like LambdaTest to perform our test execution, we are using the below-shown variables.
Here, you can populate the values for your corresponding username and access key, which can be collected by logging into your LambdaTest Profile Section. You can copy the Username and the Access Token to be used in the code. However, the grid URL will remain the same, as shown below.
We have also used the Listener class here in order to customize the TestNG Report. TestNG provides us with a lot of Listeners (e.g., IAnnotationTransformer, IReporter, etc.). These interfaces are used while performing Selenium automation testing mainly to generate logs and customize the TestNG reports.
To implement the Listener class, you can simply add an annotation in your test class just above your class name.
Syntax:
[@Listeners](
3. @BeforeTest (метод установки): Здесь мы использовали LambdaTest Desired. Генератор возможностей и установили необходимые возможности имени браузера, версии, платформы и т. д. для нашего Селен удаленный веб-драйвер. После этого открываем сайт в запущенном браузере.
4. @Test(findElementByCompleteTextMatch): В этом случае мы сначала заходим на веб-страницу Selenium Playground. После этого мы находим кнопку Checkbox Demo, используя полное совпадение текста, и нажимаем ее. В конце мы печатаем заголовок веб-страницы.
5. @AfterTest(closeBrowser): Здесь мы просто закрываем запущенный браузер.
После завершения тестов вы также можете просмотреть результаты тестов, журналы и записи тестов в личном кабинете. Панель автоматизации LambdaTest.
Консольный вывод
После запуска тестового примера вывод консоли будет выглядеть примерно так:
Вы также можете подписаться на Канал LambdaTest на YouTube и будьте в курсе последних руководств по тестированию Selenium, Cypress E2E-тестированиеCI/CD и многое другое.
Обратите внимание ConnectionFailedException произошло, когда клиент не может установить соединение с конечными точками selenium hub или webdriver.
Найти элемент по тексту в Selenium для частичного совпадения текста
В предыдущем примере этой статьи о том, как найти элемент по тексту в Selenium WebDriver, вы видели, как можно использовать findElement по тексту для полного совпадения текста. В этом разделе мы поймем, как мы можем использовать частичное совпадение текста для поиска веб-элементов.
Вариант использования
Войдите в Selenium Playground.
Определите все веб-элементы, в именах которых есть таблица.
Распечатайте текст всех таких веб-элементов.
Давайте посмотрим на локатор для приведенного выше тестового примера.
Реализация
Как показано на рисунке выше, мы используем текст таблицы с его тегом a для частичного совпадения, и в результате мы получаем в общей сложности 5 веб-элементов, используя указанный выше локатор. Поскольку существует более 1 веб-элемента, в этом случае мы будем использовать FindElements.
НайтиЭлементы в Selenium возвращает вам список веб-элементов, соответствующих значению локатора, в отличие от FindElement, который возвращает только один веб-элемент. Если на веб-странице нет подходящих элементов, FindElements возвращает пустой список.
Синтаксис FindElements в Selenium:
List<WebElement> listName= driver.findElements(By.<LocatorStrategy>(“LocatorValue”))
Следовательно, правильная реализация с использованием FindElements с частичным совпадением текста здесь будет такой:
List<WebElement> tableOptions=driver.findElements(By.xpath(“//a[contains(text(),’Table’)”)
Давайте теперь воспользуемся тем же и напишем наш тестовый пример.
Вы можете обратиться к приведенному ниже тестовому примеру.
package LambdaTest;
import org.openqa.Selenium.By;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.remote.DesiredCapabilities;
import org.openqa.Selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
[@Listeners](
class AutomationUsingFindElementByText {
public String username = "YOUR USERNAME";
public String accesskey = "YOUR ACCESSKEY";
public static RemoteWebDriver driver = null;
public String gridURL = "[@hub](
[@BeforeTest](
public void setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "chrome");
capabilities.setCapability("version", "96.0");
capabilities.setCapability("platform", "win10"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("build", "AutomationUsingFindElement");
capabilities.setCapability("name", "AutomationUsingFindElementSuite");
try {
driver = new RemoteWebDriver(new URL(" + username + ":" + accesskey + gridURL), capabilities);
} catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
[@Test](
public void findElementByPartialTextMatch() {
try {
System.out.println("Logging into Lambda Test Selenium Playground");
driver.get("[
List<WebElement> tableOptions= driver.findElements(By.xpath("//a[contains(text(),'Table')]"));
for(WebElement e: tableOptions){
System.out.println("The different options with table in name are:"+e.getText());
}
} catch (Exception e) {
}
}
[@AfterTest](
public void closeBrowser() {
driver.close();
System.out.println("The driver has been closed.");
}
}
Вы можете использовать приведенный ниже файл testng.xml для запуска вышеуказанного тестового примера.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "[
<suite name="AutomationUsingFindElementSuite">
<test name="AutomationUsingFindElementTest" >
<classes>
<class name="LambdaTest.AutomationUsingFindElementByText" >
</class>
</classes>
</test>
</suite>
И приведенный ниже файл pom.xml для установки всех необходимых зависимостей.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="[
xmlns:xsi="[
xsi:schemaLocation="[ [
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>LambdaTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.Seleniumhq.Selenium</groupId>
<artifactId>Selenium-api</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.Seleniumhq.Selenium</groupId>
<artifactId>Selenium-remote-driver</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.Seleniumhq.Selenium</groupId>
<artifactId>Selenium-chrome-driver</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>4.4.3</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
Пошаговое руководство по коду
В этом разделе о том, как найти элемент по тексту в Selenium, давайте теперь подробно рассмотрим пошаговое руководство по тестовому примеру. Операторы BeforeTest и import остаются такими же, как мы видели в нашем предыдущем примере.
@Test(findElementByPartialTextMatch): В этом случае мы сначала заходим на веб-страницу Selenium Playground. После этого мы находим все веб-элементы, которые Стол в их тексте и сохранить их в списке. Позже мы перебираем список и печатаем их текст.
После завершения тестов вы также можете просмотреть результаты тестов, журналы и записи тестов в личном кабинете. Панель автоматизации LambdaTest.
Вы также можете увидеть результаты теста на Панель аналитики LambdaTest. Панель инструментов показывает все детали и показатели, связанные с вашими тестами.
Перейдите на панель инструментов LambdaTest Analytics, чтобы просмотреть показатели ваших тестов. Вы можете быстро оценить производительность и общее состояние теста в обзоре теста. Сводка тестов покажет, сколько пройденных и неудачных тестов выполнила ваша команда, а также общую эффективность этих тестов.
Консольный вывод
После запуска тестового примера вывод консоли будет выглядеть примерно так:
Если вы разработчик или тестировщик и хотите поднять свои навыки на новый уровень, сертификация Selenium 101 от LambdaTest поможет вам достичь этой цели.
Вот краткий обзор сертификации Selenium 101 от LambdaTest:
Вывод
В этом Учебник по Selenium Java о том, как найти элемент по тексту в Selenium WebDriver, мы изучали поиск элемента по тексту в Selenium. Мы увидели, как можно использовать метод text() как в случае полного, так и частичного совпадения текста. Мы также увидели, как мы можем использовать его в случае с FindElements и получить список веб-элементов посредством сопоставления текста. В конце концов, мы также реализовали кейсы с использованием Selenium с Java в облаке Selenium Grid.
Честно говоря, использование text() — один из моих любимых методов в Selenium, когда дело доходит до поиска веб-элементов, поскольку его очень легко реализовать и его можно любым образом настроить в соответствии с нашим вариантом использования.
Я надеюсь, вам понравилось читать эту статью о том, как найти элемент по тексту в Selenium, вы узнали больше о FindElement By Text, и я думаю, что этот метод станет и вашим личным любимым. 🙂
Удачного тестирования!!