Selenium (Java) - получение идентификаторов списков на основе других атрибутов - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть 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 или текста метки?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018
         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));
        }
0 голосов
/ 21 сентября 2018

Это должно выбрать все элементы 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...