У меня есть такой html-фрагмент:

<div class="hb-felt">
   <ul class="hb-feltlist">
      <li data-selector="refusal_alt" class="ng-star-inserted">
        <input class="hb-checkbox ng-untouched ng-pristine ng-valid" 
         disableelementilesemodus="" type="checkbox" 
         id="refusalTooExpensive">
        <label class="hb-label" for="refusalTooExpensive">Too 
         expensive
        </label>
      </li>
      <li data-selector="refusal_alt" class="ng-star-inserted">
         <input class="hb-checkbox ng-untouched ng-pristine ng-valid" 
          disableelementilesemodus="" type="checkbox" 
          id="refusalInvalid">
         <label class="hb-label" for="refusalInvalid">Invalid</label>
      </li>
      <li data-selector="refusal_alt" class="ng-star-inserted">
         <input class="hb-checkbox ng-untouched ng-pristine ng-valid" 
          disableelementilesemodus="" type="checkbox" 
          id="refusalEconomy">
         <label class="hb-label" for="refusalEconomy">Economy-related 
          refusal</label>
      </li>
      <li data-selector="refusal_alt" class="ng-star-inserted">
         <input class="hb-checkbox ng-untouched ng-pristine ng-valid" 
          disableelementilesemodus="" type="checkbox" 
          id="refusalLackingPrimaryFunds">
         <label class="hb-label" for="refusalLackingPrimaryFunds">Lacking 
          primary funds</label>
      </li>
      <li data-selector="refusal_alt" class="ng-star-inserted">
         <input class="hb-checkbox ng-untouched ng-pristine ng-valid" 
          disableelementilesemodus="" type="checkbox" 
          id="refusalSecondaryFunds">
         <label class="hb-label" for="refusalSecondaryFunds">Lacking 
          secondary funds</label>
      </li>
      <li data-selector="refusal_alt" class="ng-star-inserted">
         <input class="hb-checkbox ng-valid ng-dirty ng-touched" 
          disableelementilesemodus="" type="checkbox" id="refusalOther">
         <label class="hb-label" for="refusalOther">Other</label>
      </li>
   </ul>
</div>

Как видите, каждый элемент списка включает тег data-selector="refusal_alt". Это одинаково для всех элементов.

Это динамически созданный список, и тег id и текст метки будут отличаться (но селектор данных всегда будет одинаковым).

Как лучше всего для Selenium пройти через это и составить список всех тегов id или текста ярлыка?

0
Hfrav 21 Сен 2018 в 14:12

2 ответа

Лучший ответ

При этом должны быть выбраны все элементы label, у которых есть родительский элемент li с атрибутом data-selector, установленным на refusal_alt. После этого вы перебираете совпавшие элементы, и для каждого совпадающего элемента вы определяете его текст и помещаете результат в результирующий список:

List<WebElement> matchedElements = driver.findElement(By.cssSelector("li[data-selector='refusal_alt'] > label"));
List<String> labels = matchedElements.stream().map(element -> element.getText()).collect(Collectors.toList());

Или даже короче (ярлыки):

List<String> labels = driver.findElement(By.cssSelector("li[data-selector='refusal_alt'] > label")).stream().map(element->element.getText()).collect(Collectors.toList());

( идентификаторы ):

List<String> ids= driver.findElement(By.cssSelector("li[data-selector='refusal_alt'] > label")).stream().map(element->element.getAttribute("for")).collect(Collectors.toList());
3
Tommy Brettschneider 21 Сен 2018 в 11:30
         WebElement ul=driver.findElement(By.tagName("ul"));
        List<WebElement>lis=ul.findElements(By.tagName("li"));

        for(WebElement li:lis)
        {
            WebElement label=li.findElement(By.tagName("label"));

            String id=label.getAttribute("for");
            //every li is creating attribute for and that's your id for that 
             particular input field
            li.findElement(By.id(id));
        }
2
akshay lalwani 21 Сен 2018 в 11:28