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

Как правильно проверить, что в списке элементов есть один из двух ранее выбранных элементов.

junit
selenium
webdriver
java
Теги: #<Tag:0x00007f7b6986efc0> #<Tag:0x00007f7b6986e4f8> #<Tag:0x00007f7b6986e1d8> #<Tag:0x00007f7b6986dc60>

(pauloo89) #1

Java Selenium Junit
Есть фильтр, я в нем выбираю два условия, нужно проверить что есть элементы которые соответствуют первому либо второму.

Я думал вот так:


        for (WebElement ellemm : trainLIst) {

            try {
                ellemm.getText().equals(firstTupeTrain);
            } catch (Exception ex) {
                ellemm.getText().equals(secondTupeTrain);

            }
        }

но в таком случае даже если элемент не совпадает с текстом он не идет его сравнивать со вторым элементом

и я сделал Assertom

for (WebElement ellemm : trainLIst) {
            
           try {
               Assert.assertTrue(ellemm.getText().equals(firstTupeTrain));
           }
           catch(AssertionError ex){
               Assert.assertTrue(ellemm.getText().equals(secondTupeTrain));
            }
            
        }

Но кажется что так делать не стоит.
Подскажите кто как такое реализует


(pauloo89) #2

почему не кидает эксепшн в первом случае я нашел, подскажите такая реализация подходит или надо менять


(Ray Romanov) #3

В Java я не силен, но вот пример который я использую в своем тесте (PHP) (граблю список клубных карт и если есть карта “Standart (13 работ)” в списке то выбираю ее иначе беру первую из списка):

$klubCard = array_map("trim", explode("\n", $I->grabTextFrom('//*[@id="group"]')));
if (array_search('Standart (13 работ)', $klubCard)) {
	$I->selectOption(['id' => 'group'], 'Standart (13 работ)');
} else {
	$I->selectOption(['id' => 'group'], $klubCard[1]);
}

(Aleksey Ilyenko) #4
boolean result = trainList.stream()
                          .map(WebElement::getText)
                          .filter(Objects::nonNull)
                          .anyMatch(txt -> txt.equals(firstTupeTrain) 
                                        || txt.equals(secondTupeTrain));

(Дмитрий Мирошник) #5

А в лоб пробовали?

Assert.assertTrue(ellemm.getText().equals(firstTupeTrain || ellemm.getText().equals(secondTupeTrain));

Или вот так, для улучшения читаемости:

testResult = ellemm.getText().equals(firstTupeTrain || ellemm.getText().equals(secondTupeTrain);
Assert.assertTrue (testResult);


(Сергей Кузьмин) #6

на самом деле правильно
https://commons.apache.org/proper/commons-collections/

AssertTrue(CollectionUtils.containsAny(avaliableAccounts,customerAccounts));

stackoverflow
вот мой пример - может кому пригодится

String[] customerAccounts = allCustomerAccountsAsString.split(",");

ArrayList<String> avaliableAccounts = ...
// I can switch to any of my accounts
assertTrue(avaliableAccounts.containsAll(new HashSet<String>(Arrays
                .asList(customerAccounts))));
// And I can not see any other accounts
            pattern = Pattern.compile("^(?!"
                    + StringUtils.join(customerAccounts, "|") + ").*$");
            matcher = pattern.matcher(otherAccountId);
            assertFalse(matcher.find());


// I can find one  of my accounts - for 
// http://automated-testing.info


assertTrue(CollectionUtils.containsAny(
     avaliableAccounts,  
     new ArrayList<String>(Arrays.asList(customerAccounts))));

(pauloo89) #7

В лоб вот такая ошибка получается


(pauloo89) #8

Ваш вариант в возвращает true независимо от того выбранные варианты совпадают с проверкой или нет


(pauloo89) #9

Ваш вариант я не могу понять.
Он будет проверять каждую строку в массиве на совпадение одному либо второму условию?
Я так понял он делает массив и проверяет его со вторым массивом, чтобы были одинаковые, или нет?


(pauloo89) #10

Может я не так условия описал
Есть:
“чек бокс 1”, “чек бокс 2”, “чек бокс 3”.
я нажал “чек бокс 1” и “чек бокс 2”.
появился список веб элементов,
с названиями: “чек бокс 1”, “чек бокс 1”, “чек бокс 1”, “чек бокс 2”, “чек бокс 2”, “чек бокс 1”, “чек бокс 2”, “чек бокс 1”.
и у меня есть две переменные: “чек бокс 1” и “чек бокс 2”.
я беру список получивших элементов и смотрю чтобы в нем было “чек бокс 1” ловлю ошибку смотрю чтобы было “чек бокс 2” если нет, то тест падает.


(Дмитрий Мирошник) #11

Не, ну скобки можно было бы и самостоятельно подравнять :slight_smile:
Должно быть вот так:
Assert.assertTrue(ellemm.getText().equals(firstTupeTrain) || ellemm.getText().equals(secondTupeTrain));


(pauloo89) #12

Так я и подправил )
Только не там ее поставил( видимо еще спал


(pauloo89) #13
List<WebElement> trainList = driver.findElements(By.cssSelector("[style='display: list-item;'] [class='train-speed-category']"));
        
        for (WebElement ellemm : trainList) {

            Assert.assertTrue(ellemm.getText().equals(firstTupeTrain) || ellemm.getText().equals(secondTupeTrain));

        }

Работает, а от for ни как не избавится?


(Sergey Korol) #14

Так написали ж уже, как через stream итерироваться.


(pauloo89) #15

Он не корректно работал я выше отвечал, там даже если элемента нужного не было он возвращал true


(Sergey Korol) #16

А подправить самостоятельно совсем никак? Или вы только готового решения ждете?


(pauloo89) #17

ну я вот сейчас как раз это и делаю, просто часто задавая вопросы, пытаюсь что то сделать сам и потом смотрю как сделали, и как сделал я в итоге.


(Sergey Korol) #18

Это плохая практика. Вначале показывайте свой код, и лишь потом просите о помощи. Особенно если вам уже привели готовое решение, в котором нужно сделать всего пару минорных модификаций под ваш кейс. В противном случае, вам кто-то напишет решение, которое вы бездумно скопипастите, даже не понимая, как оно работает.


(pauloo89) #19
String firstTupeTrain = listCheckboks.get(0).getText();
        String secondTupeTrain = listCheckboks.get(1).getText();

        listCheckboks.get(0).click();
        listCheckboks.get(1).click();
        List<WebElement> trainList = driver.findElements(By.cssSelector("[style='display: list-item;'] [class='train-speed-category']"));

        boolean result = trainList.stream()
                .map(WebElement::getText)
                .filter(Objects::nonNull)
                .equals(firstTupeTrain)
                        || equals(secondTupeTrain);
        System.out.println(result);

result сейчас всегда false, независимо совпадает проверка со списком или нет


(Sergey Korol) #20

Т.е. вас не смутило сравнение Stream<String> со String? Естественно вы всегда будете получать false.

Приведенный ранее код был правильным. Просто там использовалось условие anyMatch, что по факту находит любое совпадение и возвращает результат. Если необходимо проверить все элементы, то должна использоваться другая терминальная операция - allMatch.