繁体   English   中英

Java。 Selenium Webdriver。 从表中获取单元格值

[英]Java. Selenium webdriver. Get cell value from table

这是我的一部分

<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 ">user1@mail.com</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的Firebug时,它还表明值位于内部

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

找到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选择器来定位表行,然后找到每个表行的行单元格。

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"));

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

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]获取该行的第二列并比较用户名。 如果需要比较其他字段,可以进行修改。

另外,您可以使用chrome控制台断言xpath选择器是否正常工作,或者是否正在返回您想要的所有内容:

$x("your xpath selector here")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM