2011-09-21 2 views
0

셀레늄 2의 테이블에서 값을 얻는 더 좋은 방법이 있는지 궁금합니다. 현재 각 TR에 대해 2 개의 루프를 사용하고 있으며 모든 TR에 대해 각 TR 루프 내에서 루프를 사용하고 있습니다. 그래서 예를 들어 10 열이있는 테이블 행이 있으면 10 번 반복하고 텍스트 값을 꺼냅니다. 그것은 나에게 clunky 보인다.셀레늄 2 및 HTML 테이블

내 테이블 행은 너무

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

처럼 내가 나에게 date_activated 클래스 =와 TD 요소를 얻을 각 테이블 행에 대해 말할 수 있어야한다고 생각하고 날짜를 반환했습니다 보인다. 나는 몇 가지를 시도했지만 내 실제 코드는

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

답변

2

이 시도입니다 도움이된다면 아무것도 TD 클래스 명 = foo는

에 따라 일 것 같았다 :

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

것은 반환하는 모든 TD 요소는 foo 인 부모 행이있는 date_activated 클래스가 있습니다. 그런 다음 요소를 반복하고 getText을 사용하여 날짜를 가져올 수 있습니다. 이 페이지의 루트에서 작동합니다. 각 TR 요소에서 작업을 수행하려는 경우

, 시도 :

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

나는 일반적으로 xpaths를 피하려고 노력하지만, 더 좋은 해결책을 찾을 때까지 잘 작동합니다. 고맙습니다 – ducati1212

0

을 당신이 CSS 선택기를 사용하려는 경우, 시도 :

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

주 공간을 "#tableId .date_activated".

ID가 tableId 인 테이블에서 date_activated 클래스의 모든 요소를 ​​선택합니다. 각 셀의 텍스트를 가져 오려면이 목록을 반복해야합니다.

약간의 간단한 선택은 충분 있습니다

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

이 페이지에 클래스 date_activated모든 요소를 찾을 수 있습니다.

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