[英]Selenium WebDriver - Java. Please help selecting item from list by?
[英]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 ">"</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.