Как извлечь динамические значения атрибутов id элементов таблицы, используя Selenium и Java - PullRequest
4 голосов
/ 16 апреля 2019

У меня есть таблица, где в каждой строке будет ссылка для скачивания с (частично) автоматически сгенерированным элементом id. Причина этого заключается в том, что фактический элемент href всегда будет "#", поэтому идентификатор разделяет загрузки.

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

Я получаю доступ к каждой строке по одному за раз, поэтому мне нужно смотреть только в ОДИН тд за раз. Не нужно просматривать всю таблицу.

Я хорошо знаю, как найти элемент, когда знаю имя. Но найти элемент, когда я знаю только тип, - это другое дело.

...
<tr>
 <td class="journalTable-journalPost"
  <a class="htext-small" href="#" id="downloadJournalPost-345">Download</a>
 </td>
</tr>
<tr>
 <td class="journalTable-journalPost"
  <a class="htext-small" href="#" id="downloadJournalPost-346">Download</a>
 </td>
</tr>
...

Я не могу найти ни одного метода (ов) в веб-драйвере, который бы позволил мне найти элемент по типу.

Частичное имя будет работать, поскольку идентификаторы получают имя «downloadJournalPost-xxx», где изменяется только xxx. Но единственное значение, которое я могу найти, - это текст ссылки, который позволяет мне искать частичное совпадение.

РЕДАКТИРОВАТЬ: более полная разметка.

<td class="journalTable-journalpost">
 <span class="hb-tekst--sekundar">In <!----><est-ikon class="ng-star-inserted">
  <div aria-hidden="true" class="hb-ikon hb-ikon--pil3-inn  ">
   <svg focusable="false">
    <use xlink:href="#ikon-pil3-inn"></use>
   </svg>
  </div></est-ikon><!----></span>
 <span class="hb-tekst--mellomTittel hb-avstandIngen"> Application and attachments</span>
 <a class="hb-tekst--liten" href="#" id="lastNedJournalPost-2892">Download journal post</a>
</td>

Ответы [ 2 ]

4 голосов
/ 16 апреля 2019

Чтобы напечатать Список из id атрибута элемента, который вам нужно вызвать WebDriverWait для visibilityOfElementLocated и вы можете использовать Java8 stream() и map(), и вы можете использовать любую из следующих стратегий локатора :

  • cssSelector

    List<String> myID = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("td.journalTable-journalPost>a.htext-small"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList());
    System.out.println(myIDs);
    
  • xpath

    List<String> myIDs = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//td[@class='journalTable-journalPost']/a[@class='htext-small' and text()='Download']"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList());
    System.out.println(myIDs);
    
2 голосов
/ 16 апреля 2019

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

Используйте метод findElements для извлечения всех ссылок, используя следующий локатор

table tr td[class='journalTable-journalPost'] a

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

Пример кода:

List<WebElement> listOfLinks = driver.findElements(By.cssSelector("table tr td[class='journalTable-journalPost'] a"));

for(WebElement link: listOfLinks) {
     System.out.println("id:" + link.getAttribute("id"));
}
...