开发者

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++;
        }


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()


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();               
    }            
 }


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜