Selenium 2和html表

时间:2011-09-21 16:50:45

标签: selenium webdriver selenium-webdriver

只是想知道是否有更好的方法从selenium 2中的表中获取值。我目前正在使用2 for循环我循环遍历每个TR并且在每个TR I循环遍及所有TD。所以例如,如果我有一个包含10列的表行,我循环10次并拉出文本值。这对我来说似乎很笨拙。

我的表行如此

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

我想我应该能够为每个表行说一下,给我带有class = date_activated的TD元素并让它返回日期。我尝试了一些东西,但基于TD类名称= foo

似乎没有任何效果

如果它有助于我的实际代码

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

3 个答案:

答案 0 :(得分:2)

试试这个:

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

这将返回具有类date_activated的所有TD元素以及具有类foo的父行。然后,您可以遍历元素并使用getText来获取日期。这可以从页面的 root 开始。

如果您想从每个 TR元素中执行此操作,请尝试:

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

答案 1 :(得分:1)

我发现将表作为表更容易。您仍然必须使用XPath,但它仅限于表格。

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

答案 2 :(得分:0)

如果您更喜欢使用css选择器,请尝试:

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

请注意"#tableId .date_activated"中的空格。

这将选择ID为date_activated的表中具有类tableId的所有元素。您仍然需要遍历此列表以获取每个单元格的文本。

一个更简单的选择器可能就足够了:

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

这将在您的网页上找到所有date_activated的元素。