Логические операторы " AND " в selenium (selenide)

Теги: #<Tag:0x00007f7394875b90> #<Tag:0x00007f7394875a78> #<Tag:0x00007f7394875910>
    $(By.className ("service")) && (By.id("sidebar_service")).shouldHave (text("Music"));

Подскажите пожалуйста, как правильно написать AND ?

Гораздо проще:

$("#sidebar_service.service").shouldHave(text("Music"));

2 симпатии

Мне нужно, проверить что текст “Music” отображается в двух местах

$(By.className ("service")).shouldHave (text("Music") && (By.id("sidebar_service")).shouldHave (text("Music"));
Мб так?

1 симпатия

Почти.
Нужно просто написать две отдельные строки:

$(".service").shouldHave(text("Music"));
$("#sidebar_service").shouldHave(text("Music"));
1 симпатия

Подскажите как быть если два элемента есть и в одном может сдержатся текст а во втором нет или наоборот - в общем надо проверить их оба и если есть текст хотя бы в одном то это ОК.

Через try catch

Пишете функцию

public boolean isElement(SelenideElement element) {

  try{
       element.shouldHave(text("Music"));
  catch(ElementNotFound e){
       return false;
  }

  return true;
}

//Затем там где проверка нужна пишите

if(isElement($(".service")) || isElement($("#sidebar_service" ))) {
System.out.println("Ok");
}

Я бы так сделал

я надеялся на что то вроде такого, вроде как exist должен возвращать true or false

element1.shouldHave(text("Music")).should(exist) || element2.shouldHave(text("Music")).should(exist)
но я так полагаю я где то ошибаюсь

Есть такой вариант:

$$(".service,#sidebar_service").filterBy(text("Music")).should(exist);

1 симпатия

Интересно. И такой вариант возвращает true или false?

А я всю дорогу пишу обработку исключений :see_no_evil:

А зачем вам true/false?
Нет, он убеждается, что хотя бы один элемент с таким селектором и текстом существует. Если нет - тест падает.

Обработка исключений - плохая идея. Хотя бы потому, что на это тратится лишние 4 секунды, и Селенид созраняет скриншот.

1 симпатия

Спасибо за инфу, буду разбираться)

(element1,element2).filterBy(text("Music")).should(exist);
как я понял filterBy работает с коллекцией элементов, а если есть 2 элемента (element1,element2) то мне их надо запихнуть в коллекцию, что бы эта штука завелась?

public SelenideElement element1 = $x ("XXXXXXXX");
public SelenideElement element2 = $x ("YYYYYYYY");

в примере выше, как я понял, объявляется коллекция, куда ищутся элементы по 2 локаторам, и дальше в этой коллекции ищутся элементы с нужным текстом

$$ - это и есть коллекция. Ничего запихивать никуда не нужно)

@asolntsev а как проверить видимость элемента, но чтобы тест не упал, если элемент не visible?

то что это $$ или $$x есть коллекция я понимаю - но в таком случае мы указываем непосредственно локаторы как здесь $$(".service,#sidebar_service") , может быть ситуация когда допустим один локатор определен с помощью Css селектора второй с помощью Хpath. у меня ситуация следующего характера.

public class PageA {

        public static class BlockA {

        public SelenideElement element1 = $x ("XXXXXXX");
        public SelenideElement element2 = $x ("YYYYYYY");
       }
    
      public static class BlockB {
      }
}

-----------------------------------------------------
 @Test
    public void SomeCheck() {
          //осуществляем фильтрацию 
          //получаем список
          //переходим в один из айтемов списка
          //необходимо убедится что в блоке А у элемента 1 или элемента 2 есть текст "Music"
          //если хотя бы у одного есть то значит ОК 

        PageA.BlockA blockA = new PageA.BlockA();

        (blockA.element1, blockA.element1).filterBy(text("Music")).should(exist);
    }

поэтому мне и надо как то определить эти элементы (blockA.element1 и blockA.element1) в коллекцию чтобы потом осуществить .filterBy(text(“Music”)).should(exist);

Так реализуй проверку в классе BlockA и вызывай из класса SomeCheck функцию проверки. Я ничего не понимаю, зачем такие сложности?) :man_shrugging:

то может я не достаточно нормально поясняю :upside_down_face: руки не успевают за полетом мысли, я буду стараться :blush:
У меня есть 2 страницы и отдельно тесты. Страница главная содержит фильтра и список который изменяется в зависимости от фильтров. если кликнуть по айтему списка мы попадаем на отдельную страницу PageA которая разбита на условные блоки и эти блоки содержат элементы , к которым я и пытаюсь достучатся из теста чтобы проверить наличие текста.