Селен 2 и HTML таблицы - PullRequest
       2

Селен 2 и HTML таблицы

0 голосов
/ 21 сентября 2011

Просто интересно, есть ли лучший способ получить значения из таблицы в селене 2. В настоящее время я использую 2 для циклов, которые я зацикливаю для каждого TR, и внутри каждого TR, я зацикливаюсь для всех TD.так, например, если у меня есть строка таблицы с 10 столбцами, я повторяю цикл 10 раз и извлекаю текстовое значение.Это кажется мне неуклюжим.

Моя таблица Rows выглядит так

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

Я думаю, что я должен быть в состоянии сказать для каждой таблицы Row, получить мне элемент TD с class = date_activation и вернуть его.Я попробовал несколько вещей, но, похоже, ничего не работало, основываясь на имени класса 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 ]

2 голосов
/ 21 сентября 2011

Попробуйте это:

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

Это вернет все элементы TD с классом date_activated с родительской строкой с классом foo.Затем вы можете просмотреть элементы и использовать getText для получения дат.Это работает от root страницы.

Если вы хотите сделать это из каждого TR элемента , попробуйте:

trElement.findElement(By.xpath("./td[@class='date_activated']")).getText()
1 голос
/ 04 июля 2014

Мне было проще работать с таблицами в виде таблицы. Вам все еще нужно использовать 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();               
    }            
 }
0 голосов
/ 28 января 2014

Если вы предпочитаете использовать селектор CSS, попробуйте:

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

Обратите внимание на пробел в "#tableId .date_activated".

Это выберет все элементы класса date_activated в таблице с идентификатором tableId. Вам все еще нужно будет просмотреть этот список, чтобы получить текст каждой ячейки.

Возможно, будет достаточно немного более простого селектора:

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

Это найдет всех элементов с классом date_activated на вашей странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...