2016-03-28 57 views
0

获取单元格的值这里是我的一块HTML的Java。硒webdriver。从表

<table class="table_results data ajax" data-uniqueId="20605"> 
    <thead> 
    </thead> 
    <tbody> 
    <tr class="odd"> 
    <td data-decimals="0" data-type="int" class="right data not_null nowrap">1</td> 
    <td data-decimals="0" data-type="string" data-originallength="5" class="data not_null text ">user1</td> 
    <td data-decimals="0" data-type="string" data-originallength="40" class="data not_null text ">e38ad214943daad1d64c102faec29de4afe9da3d</td> 
    <td data-decimals="0" data-type="string" data-originallength="14" class="data not_null text ">[email protected]</td> 
    <td data-decimals="0" data-type="string" data-originallength="6" class="data not_null text ">Smith</td> 
    <td data-decimals="0" data-type="string" data-originallength="1" class="data not_null text ">&quot;</td> 
    </tr> 
    </tbody> 
</table> 

所以我需要的是检索单元格的值。 还有一件事是,当通过浏览器的源代码选项查看代码时,它看起来与上面相同。但使用Firefox的萤火,当另外表明,价值观是

<span></span> 

标签

里面我知道这里XPath是解决方案。在过去的2个小时里,我尝试了很多,但都没有成功。 当然,我也看到类似的问题的解决方案,但不知何故,他们不适合我。

我想要做的事:

WebElement table_element = driver.findElement(By.xpath("//table//tbody")); 
    ArrayList<WebElement> rows = (ArrayList<WebElement>) table_element.findElements(By.tagName("tr")); 
    for (WebElement row : rows) { 
     ArrayList<WebElement> cells = (ArrayList<WebElement>) row.findElements(By.tagName("//td")); 
     for (WebElement cell : cells) { 
      System.out.println(cell.getText()); 
     } 
    } 
+0

提供'xpath'你试过和单元格的值你想得到 – Andersson

+0

对不起,不能粘贴在这里,所以它填充格式正确的方式。我将它添加到问题 – Kleeo

回答

0

找到td元素,并调用.getText()方法:

List<WebElement> rows = driver.findElements(By.cssSelector("table.table_results tr")); 
for (WebElement row: rows) { 
    List<WebElement> cells = row.findElements(By.cssSelector("td.data")); 
    for (WebElement cell: cells) { 
     System.out.println(cell.getText()); 
    } 
} 

在这里,我们使用CSS选择查找表中的行,然后为每个表格行排列单元格。

+0

在第一行中返回空列表。所以它不起作用。我用我的检索方式得到同样的问题。 – Kleeo

+0

也许你的桌子在iframe里面。在这种情况下,它将检索一个空列表。 –

0
List<WebElement> TRCollection = driver.findElement(By.className("table_results data ajax")).findElements(By.tagName("tr")); 

for (WebElement tr : TRCollection) 
{ 
    List<WebElement> TDCollection = tr.findElements(By.tagName("td")); 
    for (WebElement td: TDCollection) 
    { 
     System.out.println(td.getText()); 
    } 
} 

尝试找到自己的表:

List<WebElement> tables = driver.findElements(By.tagName("table")); 

调试和找到你的表之后,你可以做上面的代码:

例如像...

List<WebElement> TRCollection = tables[2].findElements(By.tagName("tr")); 
+0

我也试过这种方法。获取 'org.openqa.selenium.InvalidSelectorException。复合类名称不允许' – Kleeo

+0

看看其他框架中的表格 –

+0

如何检查它? – Kleeo

0

为了补充以前的awnser,如果需要从特定行中获取文本,可以这样做:

string userName = "user1"; 
WebElement row = driver.findElement(By.xPath("//table[contains(@class, 'table_results')]/tbody/tr/td[2][text()='" + userName + "']/..")); 

List<WebElement> cells = row.findElements(By.cssSelector("td.data")); 
for (WebElement cell: cells) { 
    System.out.println(cell.getText()); 
} 

在这种情况下,我使用td[2]来获取行的第二列并比较用户名。如果愿望比较其他领域,你可以改变它。

此外,您可以如果XPath选择工作断言或如果它返回所有要使用Chrome控制台:

$x("your xpath selector here") 
0
/** 
* match a string to the text of a table cell and return that row. 
* 
* @param table the table the data is in 
* @param cellTextEquals the text to identify the row e.g. unique ID 
* @param intCellToFind the column index in which to look for that text 
* @return table row 
*/ 
protected WebElement getRowFromTable(WebElement table, 
     String cellTextEquals, int intCellToFind) { 
    explicitWaitForElementToBeVisibleAndClickable(table); 
    WebElement tableBody = table.findElement(By.tagName("tbody")); 
    List<WebElement> rows = tableBody.findElements(By.tagName("tr")); 
    for (WebElement row : rows) { 
     List<WebElement> td = row.findElements(By.tagName("td")); 
     if (td.size() > 0 
       && td.get(intCellToFind).getText().equals(cellTextEquals)) { 
      return row; 
     } 
    } 
    return null; 
} 

/** 
* match a string to the text of a cell and return the text of 
* another specified cell in that row 
* 
* @param table the table the data is in 
* @param cellTextEquals the text to identify the row e.g. unique ID 
* @param intCellToFind the column index in which to look for that text 
* @param intCellToReturn the column index of the cell text you want to return 
* @return text of a specific cell in an html table 
*/ 
protected String getTextFromTableCell(WebElement table, String cellTextEquals, 
     int intCellToFind, int intCellToReturn) { 
    WebElement row = getRowFromTable(table, cellTextEquals, intCellToFind); 
    List<WebElement> td = row.findElements(By.tagName("td")); 
    if (td.get(intCellToFind).getText().equals(cellTextEquals)) { 
     return td.get(intCellToReturn).getText(); 
    } 
    return null; 
} 

/** 
* Gets an element from a table, either button or tagName, from a table. 
* 
* @param table the table the data is in 
* @param cellTextEquals the text to identify the row e.g. unique ID 
* @param intCellToFind the column index in which to look for that text 
* @param intCellToReturn the column index of the cell where the element is you want to return 
* @param buttonText the button text if it's a button element you want 
* @param tagName the tag name of the element i=icon, a=link etc. 
* @return Element By.tagName or button 
*/ 
protected WebElement getElementFromTableCell(WebElement table, 
              String cellTextEquals, int intCellToFind, int intCellToReturn, 
              String buttonText, String tagName) { 
    WebElement row = getRowFromTable(table, cellTextEquals, intCellToFind); 
    if (row != null) { 
     List<WebElement> td = row.findElements(By.tagName("td")); 
     if (td.get(intCellToFind).getText().equals(cellTextEquals)) { 
      if (!buttonText.equals("")) { 
       return td.get(intCellToReturn).findElement(By.xpath(
         "//button[contains(text(),'" + buttonText + "')]")); 
      } else { 
       return td.get(intCellToReturn) 
         .findElement(By.tagName(tagName)); 
      } 
     } 
    } 
    return null; 
}