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

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

html-elements
locators
web
selenium
Теги: #<Tag:0x00007f7b6467f638> #<Tag:0x00007f7b6467f4a8> #<Tag:0x00007f7b6467f340> #<Tag:0x00007f7b6467f200>

(Vladyslav Stuparenko) #1

Допустим мы создаем веб елемент :
@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 таблицу , и для наглядности мне нужно понимать с каким элементом произошли траблы


(sidelnikovmike) #2

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


(asolntsev) #3

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

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


(sidelnikovmike) #4

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


(Vladyslav Stuparenko) #5

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

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


(Руслан) #6

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

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


(Vladyslav Stuparenko) #7

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


(Stan) #8

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

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());
   }
}

(vmaximv) #9

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


(Vladyslav Lopatynskyi) #10

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

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

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


(Vladyslav Stuparenko) #11

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


(Vladyslav Lopatynskyi) #12

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


(Sergey Korol) #13

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

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


(sidelnikovmike) #14

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


(Vladyslav Stuparenko) #15

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