Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Сравнение текста в элементах, что бы тест проходил если найдено хотя бы одно совпадение с ожидаемым текстом

webdriver
java
Теги: #<Tag:0x00007f7b639454e0> #<Tag:0x00007f7b639453a0>

(Vassil Chorniy) #1

Заранее всем спасибо, этот форум очень облегчает жизнь начинающему автоматизатору
Проблема (Вопрос) заключается …
У меня есть таблица, где все данные динамически заполняются, id и уникальные классы тоже динамические.


Тест должен проходить если хотя бы в одном из элементов найден текст 132
На форуме нашел как получить список элементов и сравнить их с ожидаемым значением

List<WebElement> elements = driver.findElements(By.xpath("//div[@class='x-grid-cell-inner ']"));
        for(WebElement element: elements){
            assertTrue(element.getText().contains("132"));
        }

но так не работает, так как не каждый элемент содержит 132. Подскажите пожалуйста как можно реализовать задачу.
ps в джаве слабоват
pps Заранее всем спасибо


(Alexandr D ) #2

Вроде аналоги должны быть в Java (stream кажется), сейчас под рукой нет java к сожалению:

var elements = driver.FindElements(By.XPath("//div[@class='x-grid-cell-inner ']"));
if (elements.All(ele => !ele.Text.Contains("132"))) throw new AutotestErrorException("Беда, нету 132 ни у кого!");

(Павел) #3

В Java8 можно сделать несколькими путями:

  1. Просто узнать, есть ли хотя бы в 1 из элементов текст, и уже потом что-то делать с результатом:
boolean contains132 = elements.stream().map(WebElement::getText).anyMatch(text -> text.contains("132"));
  1. Извлечь тексты из элементов, потом использовать JUnit + Hamcrest matchers:
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.assertThat;
[..]
List<String> texts = elements.stream().map(WebElement::getText).collect(Collectors.toList());
String expected = "132";
assertThat("None of elements contains sub-string", texts, hasItem(containsString(expected)));
  1. Использовать AssertJ:
import org.assertj.core.api.Assertions;
[..]
String expected = "132";
Assertions.assertThat(elements)
    .extracting(WebElement::getText)
    .describedAs("None of elements contains sub-string %s!", expected)
    .anyMatch(text -> text.contains(expected));

(Vassil Chorniy) #4

Спасибо огромное, жаль для 10 джавы не работает, попробую 8 поставить


(Vassil Chorniy) #5

К сожалению ничего у меня так и не получилось даже после установки 8 джавы.
2. не подхватывает stream


3. не видит assertj
Screenshot_18
Screenshot_19
:cold_sweat:
Но за помощь все равно спасибо, очень понятно все описали


(Павел) #6

Ну я же не так просто оставил ссылки на библиотеки :slight_smile: Assertion фреймворки не идут в комплекте джавы, их нужно отдельно добавлять в проект. Обычно через Maven/Gradle/другой сборщик, но для обучения можно скачать и закинуть напрямую в проект через идею (гуглите как это делается).
Для примера 2 добавляйте org.hamcres:hamcrest-all:1.3 + junit:junit:4.12, для примера 3 org.assertj:assertj-core:3.10.0


(Bolatbek) #7

Да сделайте проще:

  1. ищем все элементы с локатором вида:
//div[@class='x-grid-cell-inner ' and text()='132']

или

//div[@class='x-grid-cell-inner ' and contains(text(), '132')]
  1. получаем массив элементов и если массив больше 0, то вуаля )

(Vladislav Sobol) #8

Можно еще так.

boolean hasNumber=false;

List elements = driver.findElements(By.xpath("//div[@class='x-grid-cell-inner ']"));
for(WebElement element: elements){
if(element.getText().contains(“132”)){
hasNumber=true;
break;
}
}
assertTrue(hasNumber)


(Vassil Chorniy) #9

Огромное вам спасибо, у меня был мавен с junit и selenium-java в нем, но до вашего поста, я по неопытности даже не понимал для чего мавен нужен, теперь тест заработал.


(Vassil Chorniy) #10

Bolatbek и Vladislav_Sobol благодарю и вас, но варианты предложенные Павлом элегантнее