ducati1212
ducati1212

Reputation: 855

Selenium 2 and html tables

Just wondering if there is a better way to get values from a table in selenium 2. I am currently using 2 for loops I loop over each TR and within each TR I loop over all TD. so for example if I have a table row with 10 columns I loop 10 times and pull out the text value. That seems clunky to me.

My table Rows looks like so

<tr id="cTestData" class="odd">
<td class="date_activated">08/31/2011</td>
<td class="date_redeemed"> Not redeemed * </td>
<td class="expiration_date">09/01/2011</td>
<td class="product"> State of Maine </td>
<td class="value">$1.00</td>
<td class="store"> &ndash; &ndash; &ndash; </td>
<td class="offer_details">
</tr>

I think I should be able to say for each table Row get me the TD element with class = date_activated and have it return the date. I tried a few things but nothing seemed to work based on TD class name = foo

If it helps my actual code is

for(WebElement trElement : tr_collection)
        {
            List<WebElement> td_collection=trElement.findElements(By.xpath("td"));
            System.out.println("NUMBER OF COLUMNS="+td_collection.size());
            col_num=1;          
            HashMap actInfo = new HashMap();  // new hashmap for each line inthe result set

            if(!td_collection.isEmpty() && td_collection.size() != 1 ){  
                for(WebElement tdElement : td_collection)
                {
                        System.out.println("Node Name=== " + tdElement.getAttribute("class")); 
                        System.out.println("Node Value=== " + tdElement.getText());
                        actInfo.put(tdElement.getAttribute("class"), tdElement.getText());
                    col_num++;
                }
                masterMap.add(actInfo);
            } // end if

            row_num++;
        }

Upvotes: 0

Views: 12056

Answers (3)

Chuck Brown
Chuck Brown

Reputation: 363

I found it easier to work with tables as a table. You still have to use the XPath, but it's limited to the table.

IWebElement table = driver.FindElement(By.Id("TableId")); //Get Table 
List<IWebElement> Rows = new List<IWebElement>(table.FindElements(By.XPath(".//tbody/tr")));
List<List<IWebElement>> table_element = new List<List<IWebElement>>(); 
for (int k = 0; k < Rows.Count; k++)
{                 
    table_element.Add(new List<IWebElement>(Rows[k].FindElements(By.XPath("./td")))); //Get all Elements from Rows
}

for (int k = 0; k < table_element[0].Count; k++)
{
    if (table_element[0][k].Text == "08/31/2011")
    {
        table_element[0][k].Click();               
    }            
 }

Upvotes: 1

Izabela
Izabela

Reputation: 11

If you prefer to use a css selector, try:

List<WebElement> myTds = driver.findElements(By.cssSelector("#tableId .date_activated"));

Note the space in "#tableId .date_activated".

This will select all the elements with class date_activated within a table with an id tableId. You will still need to loop over this list to get the text of each of your cells.

A little simpler selector might be sufficient:

driver.findElements(By.cssSelector(".date_activated"))

This will find all the elements with class date_activated on your page.

Upvotes: 0

prestomanifesto
prestomanifesto

Reputation: 12806

Try this:

driver.findElements(By.xpath("//tr[@class='foo']/td[@class='date_activated']"))

That will return all the TD elements with the class date_activated with a parent row with class foo. You can then loop through the elements and use getText to get the dates. This works from the root of the page.

If you would like to do it from each TR element, try:

trElement.findElement(By.xpath("./td[@class='date_activated']")).getText()

Upvotes: 2

Related Questions