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

Помоги с поиском локатора списка элемента


(Eugeniylennik) #1

Доброго времени суток!

Подскажите пожалуйста, имеется динамические элементы (инпуты) со своими значениями. Как мне найти элемент со списком всех значений. Т.е это инпут в который можно ввести текст но при клике появляется список значений которые можно выбрать.

Буду благодарен за помощь!


(Bohdan Harasym) #2
Select oSelect = new Select(driver.findElement(By.id("123456")));
List <WebElement> elementCount = oSelect.getOptions(); */ вытягивает все значения выпадающего меню/*
int iSize = elementCount.size();

for(int i =0; i>iSize ; i++){
	String sValue = elementCount.get(i).getText(); //текст или инное значение
	}

(Eugeniylennik) #3

А как это можно попроще сделать и с помощью методов селенида?


(Bohdan Harasym) #4

рекомендую обратиться на форум поддержки селенида. будет решение, напишите пожалуйста, самому интересно.
http://ru.selenide.org/documentation.html


(asolntsev) #5

Так вы скажите, какой там всё-таки html код. А то такие элементы очень разные бывают.
И второй вопрос: вы что хотите с ним сделать? Выбрать значение из списка? Проверить элементы в списке? Вбить своё значение?


(Eugeniylennik) #6

<span class="btn btn-default form-control ui-select-toggle" style="outline: 0;" ng-click="$select.activate()" ng-disabled="$select.disabled" aria-label="Select box activate" tabindex="-1">

При клике на этот элемент активным становится инпут и список. Вот код для списка

<ul class="ui-select-choices ui-select-choices-content ui-select-dropdown dropdown-menu ng-scope" ng-show="$select.open" role="listbox" repeat="color in colors | filter:$select.search" style="opacity: 1;">

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

Методы для ввода текста в инпут я описал, мне нужно еще добавить возможность выбирать значения из списка.


(asolntsev) #7

Ну, как-то так:

// 1: open dropdown
$(".ui-select-toggle").click();

// 2.A: select option by text
$(".ui-select-choices").selectOption("option text");

// 2.B: select option by value
$(".ui-select-choices").val("option value");


(Bohdan Harasym) #8

есть ли в селениде возможность вытащить все значения выпадающего меню?


(Eugene Moskalenko) #9

наверное нет, когда-то тоже пытался найти, одной строкой, у меня не вышло… :slight_smile:

Вам все равно придется запихивать в List и уже по нему ходить циклом, чтобы вывести каждое значение или количество значений.

В селенид, кстати очень интересная штука есть, если вы сделаете список в таком виде:

<ul>
   <li>текст 1</li>
   <li>текст 2</li>
</ul>

то вы не сможете воспользоваться методами select:

тест:

@Test
public void testDropDownSelenide1() {
  open("http://automated-testing.info/");
  $(By.id("search-button")).click();
  $(By.id("search-term")).sendKeys("selenide");
  String foo = $(By.xpath("//div[@class='results']/ul/ul")).getSelectedText();
  System.out.println(foo);
}

напишет ошибочку:

Caused by: support.ui.UnexpectedTagNameException: Element should have been "select" but was "ul"

Если же у вас будет список сделан, через селект:

<select>
  <option>Mustard</option>
  <option>Ketchup</option>
  <option>Relish</option>
</select>

тест:

@Test
public void testDropDownSelenide2() {
  open("https://silviomoreto.github.io/bootstrap-select/examples/");
  SelenideElement foo1 = $(By.xpath("//div[@class='bs-docs-example']/select")).getSelectedOption();
  String foo2 = $(By.xpath("//div[@class='bs-docs-example']/select")).getSelectedText();
  String foo3 = $(By.xpath("//div[@class='bs-docs-example']/select")).getSelectedValue();
  String foo4 = $(By.xpath("//div[@class='bs-docs-example']/select")).getText();
  String foo5 = $(By.xpath("//div[@class='bs-docs-example']/select")).getValue();
  String foo6 = $(By.xpath("//div[@class='bs-docs-example']/select")).text();
  String foo7 = $(By.xpath("//div[@class='bs-docs-example']/select")).val();
  System.out.printf("getSelectedOption: %s %n", foo1.toString());
  System.out.printf("getSelectedText: %s %n", foo2);
  System.out.printf("getSelectedValue: %s %n", foo3);
  System.out.printf("getText: %s %n", foo4);
  System.out.printf("getValue: %s %n", foo5);
  System.out.printf("text: %s %n", foo6);
  System.out.printf("val: %s %n", foo7);
}

то нет возможности вытащит все элементы выпадающего списка одной строкой, выведет:

getSelectedOption: <option value="Mustard" selected:true>Mustard</option> 
getSelectedText: Mustard 
getSelectedValue: Mustard 
getText: Mustard 
getValue: Mustard 
text: Mustard 
val: Mustard

если же через список:

<ul class="dropdown-menu inner">
  <li class="selected">Mustard</li>
  <li>Ketchup</li>
  <li>Relish</li>
</ul>

тест:

@Test
public void testDropDownSelenide3() {
  open("https://silviomoreto.github.io/bootstrap-select/examples/");
  $(By.xpath("//div[@class='btn-group bootstrap-select']")).click();
  //SelenideElement foo1 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).getSelectedOption();
  //String foo2 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).getSelectedText();
  //String foo3 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).getSelectedValue();
  String foo4 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).getText();
  //String foo5 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).getValue();
  String foo6 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).text();
  //String foo7 = $(By.xpath("//div[@class='btn-group bootstrap-select open']/div/ul")).val();
  //System.out.printf("getSelectedOption: %s %n", foo1.toString());
  //System.out.printf("getSelectedText: %s %n", foo2);
  //System.out.printf("getSelectedValue: %s %n", foo3);
  System.out.printf("getText: %s %n", foo4);
  //System.out.printf("getValue: %s %n", foo5);
  System.out.printf("text: %s %n", foo6);
  //System.out.printf("val: %s %n", foo7);
}

результат:

getText: Mustard
  Ketchup
  Relish 
text: Mustard
  Ketchup
  Relish

P.S. в последнее время заметил, что очень многие сейчас делают выпадашки через списки: ul -> li + JS, мало кто делает селектом… Поэтому было бы здорово наверное, если бы в селениде сделали метод, который вернул бы колмчество таких записей или вывел все записи типом List

Хотя может это и избыточно :slight_smile:


(asolntsev) #10

Да как же нет-то, вы чего?
Конечно есть.

  1. List texts = $$(By.xpath("//div[@class=‘results’]/ul/ul/li")).texts()
  2. List texts = $$(By.xpath("//select/option")).texts()

(Bohdan Harasym) #11

спасибо за ответ. это очень нужная вещь


(Eugene Moskalenko) #12

Во, супер, пасиб… :slight_smile:

Ходил вокруг да ококло. :slight_smile: