1

I want to iterate through this table and need to get a text from each row like text inside td= health1, health 2 and health 3, similarly, I need text inside the state.Hoe can I do that

<table id="TableFormtable" class="datatable" summary=" Server ">
    <tbody>
        <tr>
            <th title="Sort table by Name" scope="col"></th>
            <th title="Sort table by clusterName" scope="col"></th>
            <th title="Sort table by Machine" scope="col"></th>
            <th title="Sort table by State" scope="col"></th>
            <th title="Sort table by Health" scope="col"></th>
            <th title="Sort table by port" scope="col"></th>
        </tr>
        <tr class="rowEven">
            <td id="name1" scope="row"></td>
            <td id="clusterName1"></td>
            <td id="machineName1"></td>
            <td id="state1"></td>
            <td id="health1"></td>
            <td id="port1"></td>
        </tr>
        <tr class="rowOdd">
            <td id="name2" scope="row"></td>
            <td id="clusterName2"></td>
            <td id="machineName2"></td>
            <td id="state2"></td>
            <td id="health2"></td>
            <td id="port2"></td>
        </tr>
        <tr class="rowEven">
            <td id="name3" scope="row"></td>
            <td id="clusterName3"></td>
            <td id="machineName3"></td>
            <td id="state3"></td>
            <td id="health3"></td>
            <td id="port3"></td>
        </tr>
    </tbody>
</table>

I am using

 List<WebElement> allRows = utils
                .findElements(By.xpath("//table[@id='genericTableFormtable']/tbody/tr[@id='rowEven' or @id='rowOdd']"));

after this step how can I iterate to each row and get the respective values.

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
joshua
  • 177
  • 1
  • 12

1 Answers1

1

To create a List with the id attributes or the innerTexts using Java8's stream() and map() you can use the following based Locator Strategies:

  • Printing the id attributes:

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//table[@id='TableFormtable']/tbody//tr[@class='rowEven' or @class='rowOdd']//td[starts-with(@id, 'health')]"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList()));
    
  • Printing the innerText attributes:

    System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//table[@id='TableFormtable']/tbody//tr[@class='rowEven' or @class='rowOdd']//td[starts-with(@id, 'health')]"))).stream().map(element->element.getText()).collect(Collectors.toList()));
    
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
  • 1
    Thank you it worked, Can you explain what is this doing after we use .stream – joshua Jun 29 '20 at 11:38
  • @joshua Once you collected the desired nodes with _id_ attribute starting with _health_, to get the text you simply need to invoke `getText()` method. We created a _List_ with those desired texts and printed it. – undetected Selenium Jun 29 '20 at 12:10