Перейти к содержимому

Фотография

Прочитать все элементы из dropdown в List <String>


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1 Vikonder

Vikonder

    Новый участник

  • Members
  • Pip
  • 31 сообщений

Отправлено 15 сентября 2018 - 09:51

Камрады!

 

Столкнулся с такой проблемой:

- Необходимо прочитать весь список из dropdown и передать его в List<String>

 

23343897.jpg

 

Классически, до этого я использовал заполнение списка List<WebElement> по индексу динаического xpath

i.e.

public static String SOURCE_RACK_NAME_SELECTED = "//span[@formation-id='source-rack-name-%d']";

@Step(description = "Get all WebElements from the dropdown list input")
public List<WebElement> getAllElementsFromDropDownList(By xpathList, String xpathElement) {
      List<WebElement> webElementsArrayList = new ArrayList<>();
         aitForElementToBeVisible(xpathList);

           List<WebElement> webElementsFromDropDown = driver.findElements(xpathList);

     for (int i=0; i<webElementsFromDropDown.size(); i++) {

                  String xpathRackFilter = String.format(xpathElement, i);
                  By xpathRack = By.xpath(xpathRackFilter);
                  WebElement listElement = driver.findElement(xpathRack);
                  webElementsArrayList.add(listElement);

     }
               System.out.println("<------------- The elements List -------------> " + webElementsFromDropDown);
       return webElementsArrayList;
}

Сейчас же для магипуляций с элементами списка, они должны быть String по-умолчанию

1. Открыть dropdown

2. Прочитать весь список в List<String>

3. Random выбрать один элемент

4. Вернуть его

 

Код html:

<div class="ui-select-choices-group optgroup">
<div class="ui-select-choices-group-label optgroup-header ng-binding ng-hide" ng-show="$select.isGrouped" ng-bind="$group.name"/>
<!-- ngRepeat: rack in $select.items -->
<!-- ngIf: $select.open -->
<div class="ui-select-choices-row ng-scope active" role="option" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}" 
            ng-repeat="rack in $select.items" ng-if="$select.open" ng-click="$select.select(rack,$select.skipFocusser,$event)" style="">
<div class="option ui-select-choices-row-inner" data-selectable="" uis-transclude-append="">
<span class="ng-binding ng-scope" ng-bind-html="rack | highlight: $select.search" formation-id="source-rack-name-0">VIK6R01</span>
</div>
</div>
<!-- end ngIf: $select.open -->
<!-- end ngRepeat: rack in $select.items -->
<!-- ngIf: $select.open -->
<div class="ui-select-choices-row ng-scope" role="option" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}" 
            ng-repeat="rack in $select.items" ng-if="$select.open" ng-click="$select.select(rack,$select.skipFocusser,$event)" style="">
<div class="option ui-select-choices-row-inner" data-selectable="" uis-transclude-append="">
<span class="ng-binding ng-scope" ng-bind-html="rack | highlight: $select.search" formation-id="source-rack-name-1">VIK6R02</span>
</div>
</div>
......

Манипуляции с WebElement --> String после не работают driver.findElement не работатет корректно со String 

Как вообще возможно после открытия DropBox прочитать его размер, чтобы потом заполнить List  [ не используя  driver.findElement(xpath); ]

 

Есть ли решение со стороны Selenium?


  • 0

#2 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 15 сентября 2018 - 16:07

 

 

Необходимо прочитать весь список из dropdown и передать его в List<String>

сомневаюсь что это необходимо, вы же не проверяете что "все элементы отображаются в списке". Значит и нет необходимости считывать их все

 

 

 

Random выбрать один элемент

нет смысла выбирать рандом, выбирайте конкретный элемент, либо первый например


  • 0

#3 Vikonder

Vikonder

    Новый участник

  • Members
  • Pip
  • 31 сообщений

Отправлено 15 сентября 2018 - 19:02

Spock

Сомневаюсь, что вы бы у нас долго продержались:)

 

Randomize выбора всех возможных элементов системы после постороения Builder на каждый - это концептуальная фишка нашего

нового начальства... 

Сотни тестов, которое я написал ранее по вашей схеме идут в разрез с новой идеологией,

поэтому всё новое хотят делать именно так, поэтому изголяться приходится по-черному....


  • 0

#4 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 15 сентября 2018 - 19:25

 

 

Spock

Сомневаюсь, что вы бы у нас долго продержались:)

 

Randomize выбора всех возможных элементов системы после постороения Builder на каждый - это концептуальная фишка нашего

нового начальства... 

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

 

тест должен проверять какие-то действительно нужные и важные варианты, а не рандом. А если тест перед релизом "выберет потестировать вариант А" в то время как вариант Б сломался?

 

такое ощущение, что ваше начальство хочет проверить правильные ли данные в базе (оттуда идеи типа "выбрать все значения одно за другим", "выбирать рандомные значения"), но делает это не на том уровне - пытаются сделать это через веб-интерфейс, это медленно и ненадёжно и вообще так быть не должно


  • 0

#5 Alex

Alex

    Постоянный участник

  • Members
  • PipPipPip
  • 237 сообщений
  • ФИО:Алексей

Отправлено 17 сентября 2018 - 06:48

Камрады!

 

Столкнулся с такой проблемой:

- Необходимо прочитать весь список из dropdown и передать его в List<String>

 

23343897.jpg

 

Классически, до этого я использовал заполнение списка List<WebElement> по индексу динаического xpath

i.e.

public static String SOURCE_RACK_NAME_SELECTED = "//span[@formation-id='source-rack-name-%d']";

@Step(description = "Get all WebElements from the dropdown list input")
public List<WebElement> getAllElementsFromDropDownList(By xpathList, String xpathElement) {
      List<WebElement> webElementsArrayList = new ArrayList<>();
         aitForElementToBeVisible(xpathList);

           List<WebElement> webElementsFromDropDown = driver.findElements(xpathList);

     for (int i=0; i<webElementsFromDropDown.size(); i++) {

                  String xpathRackFilter = String.format(xpathElement, i);
                  By xpathRack = By.xpath(xpathRackFilter);
                  WebElement listElement = driver.findElement(xpathRack);
                  webElementsArrayList.add(listElement);

     }
               System.out.println("<------------- The elements List -------------> " + webElementsFromDropDown);
       return webElementsArrayList;
}

Сейчас же для магипуляций с элементами списка, они должны быть String по-умолчанию

1. Открыть dropdown

2. Прочитать весь список в List<String>

3. Random выбрать один элемент

4. Вернуть его

 

Код html:

<div class="ui-select-choices-group optgroup">
<div class="ui-select-choices-group-label optgroup-header ng-binding ng-hide" ng-show="$select.isGrouped" ng-bind="$group.name"/>
<!-- ngRepeat: rack in $select.items -->
<!-- ngIf: $select.open -->
<div class="ui-select-choices-row ng-scope active" role="option" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}" 
            ng-repeat="rack in $select.items" ng-if="$select.open" ng-click="$select.select(rack,$select.skipFocusser,$event)" style="">
<div class="option ui-select-choices-row-inner" data-selectable="" uis-transclude-append="">
<span class="ng-binding ng-scope" ng-bind-html="rack | highlight: $select.search" formation-id="source-rack-name-0">VIK6R01</span>
</div>
</div>
<!-- end ngIf: $select.open -->
<!-- end ngRepeat: rack in $select.items -->
<!-- ngIf: $select.open -->
<div class="ui-select-choices-row ng-scope" role="option" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}" 
            ng-repeat="rack in $select.items" ng-if="$select.open" ng-click="$select.select(rack,$select.skipFocusser,$event)" style="">
<div class="option ui-select-choices-row-inner" data-selectable="" uis-transclude-append="">
<span class="ng-binding ng-scope" ng-bind-html="rack | highlight: $select.search" formation-id="source-rack-name-1">VIK6R02</span>
</div>
</div>
......

Манипуляции с WebElement --> String после не работают driver.findElement не работатет корректно со String 

Как вообще возможно после открытия DropBox прочитать его размер, чтобы потом заполнить List  [ не используя  driver.findElement(xpath); ]

 

Есть ли решение со стороны Selenium?

На вашем же примере что мешает?

List<WebElement> webElementsFromDropDown = driver.findElements(xpathList);
List<String> names = new ArrayList();

for (WebElement listItem: webElementsFromDropDown) {

names.add(listItem.getText());

}

return names;

  • 1

#6 Vikonder

Vikonder

    Новый участник

  • Members
  • Pip
  • 31 сообщений

Отправлено 17 сентября 2018 - 09:51

Конструкция WebElement.getText()

                      WebElement.getAttribute("value")

у меня не прокатывает и сыпет ошибками типа:

 

400 incorrect JSON status mapping for scale element reference [object null]....

 

Вообще, трансформация WEbElement --> String очень хрупкая конструкция, на выходе которой очень часто получаются flaky тесты.


  • 0

#7 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 17 сентября 2018 - 10:13

Вообще, трансформация WEbElement --> String очень хрупкая конструкция, на выходе которой очень часто получаются flaky тесты.

 
То, что Вы написали примерно похоже на "трансформация Котлеты -> Мухи очень хрупкая конструкция". Это совершенно разные объекты. WebElement не надо "трансформировать" в строку, нужно вытащить значение нужного аттирибута, в котором и содержится текст.
WebElement.getText() - Вы прямо так и пишите? От класса getText()?

Вы попробовали тот вариант, который Вам выше написали?


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных