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

Как добавить webElements в Map. Java collections

selenium
webdriver
java
Теги: #<Tag:0x00007f7b619d4ac0> #<Tag:0x00007f7b619d4980> #<Tag:0x00007f7b619d4840>

(Ihor Bovkit) #1

Нужно добавить webElements в Map чтобы потом доступиться через key (Country name).
как лучше ето зделать, xpath к каждому div column или один xpath для всех елементов?

Html код выглядит так:

<div class="rows">
        <div class="column first">
              <div class="padd">Ukraine</div>
        </div>
<div class="column second">
        <div class="padd">
         <span class="green update-on-currency-change" data-default-currency-rate="0.12">0.12</span>
         <span class="update-currency-name">USD</span>
         /min
         </div>
</div>
<div class="column third">
       <div class="padd">
        <span class="blue update-on-currency-change" data-default-currency-rate="0.033">0.033</span>
         <span class="update-currency-name">USD</span>
         /sms
      </div>
</div>

(Sergey Korol) #2

Не совсем понятно, что вы собираетесь мапить… Исходя из приведенного куска верстки, у вас 1 страна и несколько одинаковых каренси с разным рейтом. Что из этого всего будет выступать в роли значения в вашей мапе?


(Ihor Bovkit) #3

Ето только кусок страницы, там есть все страны і свои цены.
Хочу замапить так -
Ukraine (key), 0.12 (Value), 0.033 (Value)


(Serhii Tanchenko) #4

Так не получится :smile:
В мапе к одному ключу можно сопоставить только одно значение.
Если Вы второе значение засунете в мапу для того же ключа, то оно(второе значение) просто перетрет предыдущее.


(Serhii Tanchenko) #5

Хотя можно так попробовать:

List<Double> currencies = new ArrayList<>();
currencies.add(0.12);
currencies.add(0.33);

Map<String, List<Double>> map = new HashMap<>();
map.put("Ukraine", currencies);

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


(Ihor Bovkit) #6

Всего на странице есть много стран (около 500) и к каждому писать xpath не хочется. И я думал добавить ето в Map или List а потом в for кликать на ту страну какая мне нужна (Просто по названию страны или по значению больше 100 например). Вот я и думаю как бы это сделать, обєдинить страну и значениею.
Может кто то уже такое делал


(Антон) #7

Можно представить блок со страной как яндексовский HTML element, реализовать в нем все нужные методы и получать лист этих блоков. Так гараздо более красиво, чем мапа стрингов или веб элементов.


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

Я бы написал метод типа GetDataFromCountry(string countryName), в котором отдавал все данные, которые мне нужны.
Метод должен возвращать структуру (тот же ArrayList) со значениями валюты и рэйтов (если их количество всегда одинаково для каждой страны либо известно точно, сколько их должно быть в каждом конкретном случае).
Внутри метода используем локатор по xpath с параметром страны.


(Andrew Zakordonets) #9

Как вариант можно поступить следующим образом :

  1. Создать енум с конструктором, который будет принимать страну, value1, value2 и забить этот енум всеми вашими странами, а также значениями для них

  2. Создать метод, который (на ваш выбор) будет возвращать икс пас или вебелемент. Икс пас строите внутри метода используя данные из энума. И возвращаете что нужно.
    Енум может выглядеть так :

     public enum CountryCurrencies {
     UAH("UAH", "0.2", "0.33"),
     USA("USA", "1", "1")
    
     private String countryName;
     private String value1;
     private String value2;
    
     private CountryCurrencies(String name, String value1, String value2) {
             this.countryName = name;
             this.value1 = value1;
             this.value2 = value2;
     }
    
     public String getCountryName() {
             return this.countryName;
     }
    
     public String getValue1() {
             return this.value1;
     }
    
     public String getValue2() {
             return this.value2;
     }
    

    }

соответсвенно метод по построению будет на вход принимать енум, а на выходе xpath или вебэлемент - в зависимости от того как у вас в фреймворке все устроено