Каким образом получить название веб элемента в лог ?

Допустим мы создаем веб елемент :
@FindBy(xpath = ".//[@class=‘gpp’]")WebElement googleButton;
В тесте у нас есть некоторая функция
Assert.assertEquals(element.getAttribute(“href”), text,“Element “+ googleButton + “is not have link !”+”\n”);
В данном случаем нам в консоль выпадает
Element [[FirefoxDriver: firefox on WINDOWS (98c6c742-fd49-4688-ad49-cb5cd10e4a8a)] -> xpath selector: .//
[@class=‘gpp’]] is not have link ! (допустим что тест провалился )

Вопрос состоит в том , как мне получить название переменной , которую я прописал вначале ?
Беда в том что такая запись нечитабельна , в будующем я хочу логи переносить например в xml таблицу , и для наглядности мне нужно понимать с каким элементом произошли траблы

Можно посмотреть в сторону библиотеки HtmlElements от яндекса. Там есть аннотация Name как раз для вашей задачи.

1 лайк

Попробуйте библиотеку Selenide.
Во-первых, сама проверка будет гораздо короче и понятнее:
$(".gpp").shouldHave(attribute(“href”));

А во-вторых, если эта проверка упадёт, сообщение об ошибке будет предельно понятным. Selenide всё распишет: какой элемент искали, а какой нашли и чего ему не хватило. И ещё скриншот сделает.

1 лайк

Ого! об этой стороне selenide не знал :smile: Круто!

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

Есть еще варианты ? :grimacing:

$(".gpp").shouldHave(attribute(“href”));

ну если хочешь без либ, глянь из чего состоит данный метод и вытяни нужное

Я уже пересмотрел все , ничего похожего нет :construction_worker: .Веб эелемент не располагает таким методом
Можно было бы создать кастомный веб элемент , который возвращал бы имя , типо рефлексии , не знаю

А разве нельзя просто название объекта взять? Как-то так:

public class TestClass{

   public TestClass(){
      System.out.println("Hello, I'm test class"); 
   }
   
   public static void main(String []args){
      TestClass testClass = new TestClass();
      System.out.println(testClass.getClass().getSimpleName());
   }
}

Автору нужно название филда, а не класса.

только рефлексией. Выглядеть будет примерно так:

Field[] classFields = this.getClass().getFields() // вернет Вам массив из всех полей
for(Filed field : classFields){
    log.info(field.getName());
}

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

Это мне нужно в этот массив все элементы засовывать ?

Вы можете получить этот массив со всеми полями, а дальше уже по какому то условию выбрать нужный Вам и вызвать getName(). К сожалению пока что не могу придумать пок какому именно

@Vladyslav_Stuparenko, простой ответ: без дополнительных телодвижений - никак. Единственное место, откуда вы можете получить точное имя переменной - это *.class файл. Можете посмотреть в сторону специализированных reflection библиотек. Но с учетом

Единственное решение для вас - ручной маппинг филдов с константами. Надо ли оно вам? Сомневаюсь.

Ну не хотите htmlElements - сделайте что то схожее свое)) это не сложно))

Вчера порылся в документации htmlElements , и знаете толковая вещь , попробую ее )