2
<table id="tblListViewHeader" class="adminlist" cellspacing="1" cellpadding="0" style="table-layout: fixed; width: 1003px;">
<tbody>
</table>
</td>
</tr>
<tr>
<td>
<div id="divListView" style="width: 100%; height: 300px; overflow: auto; display: block;">
<table id="tblListView" class="adminlist" cellspacing="1" cellpadding="0" style="table-layout: fixed; width: 100%;">
  <tbody data-bind="template: { name: 'ActiveGradeTemplate', foreach: ActiveGrade }">
    <tr class="row0">
      <td data-bind="text:$index()+1" style="width: 5%;">1</td>
      <td data-bind="text: GradeName" style="width: 20%;">Vantage Point</td>
      <td align="right" data-bind="text: DisplayCreatedDate" style="width: 10%;">27 Mar 2013</td>
      <td align="right" data-bind="text: CreatedByUser" style="width: 10%;">Name</td>
      <td align="right" data-bind="text: DisplayModifiedDate" style="width: 10%;">27 Mar 2013</td>
      <td align="right" data-bind="text: ModifiedByUser" style="width: 10%;">Name</td>
      <td align="center" data-bind="text: Status" style="width: 5%;">Active</td>
      <td align="center" style="width: 10%;">
        <a id="lnkEdit_7" data-bind="click: $root.lnkEdit, attr:{'id':'lnkEdit_' + GradeID}" href="#">Edit</a>
        <span id="spanEdit_7" data-bind="attr:{'id':'spanEdit_' + GradeID}"></span>
      </td>
   </tr>
   <tr class="row0">
     <td data-bind="text:$index()+1" style="width: 5%;">2</td>
     <td data-bind="text: GradeName" style="width: 20%;">test grade</td>
     <td align="right" data-bind="text: DisplayCreatedDate" style="width: 10%;">Yesterday</td>
     <td align="right" data-bind="text: CreatedByUser" style="width: 10%;">Name</td>
     <td align="right" data-bind="text: DisplayModifiedDate" style="width: 10%;">Yesterday</td>
     <td align="right" data-bind="text: ModifiedByUser" style="width: 10%;">Name</td>
     <td align="center" data-bind="text: Status" style="width: 5%;">Active</td>
     <td align="center" style="width: 10%;">
       <a id="lnkEdit_11" data-bind="click: $root.lnkEdit, attr:{'id':'lnkEdit_' + GradeID}" href="#">Edit</a>
      <span id="spanEdit_11" data-bind="attr:{'id':'spanEdit_' + GradeID}"></span>
    </td>
  </tr>

如何检索td每一行的值,这是用于动态生成的。所有的tr类名都是一样的:<tr class="row0">. 如何检索上述格式化表格的表格数据?

4

9 回答 9

15

试试下面的代码,这将打印所有单元格数据,

// Grab the table 
WebElement table = driver.findElement(By.id("divListView")); 

// Now get all the TR elements from the table 
List<WebElement> allRows = table.findElements(By.tagName("tr")); 

// And iterate over them, getting the cells 
for (WebElement row : allRows) { 
    List<WebElement> cells = row.findElements(By.tagName("td")); 

    // Print the contents of each cell
    for (WebElement cell : cells) { 
        System.out.println(cell.getText());
    }
}
于 2013-04-11T10:18:37.477 回答
2
  // Grab the table 
  WebElement table = driver.findElement(By.id("table-6")); 

  //Get number of rows in table 
  int numOfRow = table.findElements(By.tagName("tr")).size(); 

  //Get number of columns In table.
  int numOfCol = driver.findElements(By.xpath("//*[@id='table-6']/tbody/tr[1]/td")).size();


  //divided Xpath In three parts to pass Row_count and Col_count values.
  String first_part = "//*[@id='table-6']/tbody/tr[";
  String second_part = "]/td[";
  String third_part = "]";

  //take the second column values
  int j=2;

  //List to store the second column
  List<String> secondColumnList=new ArrayList<String>();

  //Loop through the rows and get the second column and put it in a list
  for (int i=1; i<=numOfRow; i++){

    //Prepared final xpath of specific cell as per values of i and j.
       String final_xpath = first_part+i+second_part+j+third_part;
       //Will retrieve value from located cell and print It.
       String test_name = driver.findElement(By.xpath(final_xpath)).getText();
       secondColumnList.add(test_name);  
       System.out.println(test_name);

  }
于 2014-11-20T11:16:36.367 回答
1

动态表数据捕获: 1.首先捕获表头数。[ int tHeadCount = driver.findElements(By.xpath("//table//tr//th")).size();]

2.Capture Table Row Count 您的实际数据存在于哪一行。[-在我看来,我需要来自第一行的数据,因此我将其硬编码为零。]如果需要,请在现有代码中添加一个 for 循环。

3.实际解决方案从这里开始。以下是函数调用“Deposited By”是相应表格数据的表格标题文本。

String tableDataValue = managePackageTableData("Deposited By");

public String  managePackageTableData(String columnName) {

//In Following line i am capturing table contains how many headers.     
        int tHeadCount = driver.findElements(By.xpath("//table//tr//th")).size();

    int statusIndex = 0;
    for(int i=0;i<tHeadCount-1;i++)
    {
    String theadValue = driver.findElements(By.className("table")).get(0).findElements(By.tagName("tr")).get(0).findElements(By.tagName("th")).get(i).getText();


    if(theadValue.equalsIgnoreCase(columnName))
    {
        statusIndex = i;
        break;
    }
    }       
    String tableData = driver.findElements(By.tagName("tbody")).get(0).findElements(By.tagName("tr")).get(0).findElements(By.tagName("td")).get(statusIndex).getText();

    return tableData;

}
于 2019-11-02T14:59:31.237 回答
0

你有很多选择,但有我的。您将所有 tds 捕获到一个列表中。

List<WebElement> tdlist = driver.findElements(By.cssSelector("table[id='divListView'] tr td"));

如果你想拥有价值,你可以使用循环。

for(WebElement el: tdlist)  {
    Systeme.out.println(el.getText());   
}
于 2013-04-11T06:43:21.093 回答
0

在遍历表和列表期间查看这个最常见的挑战自动化测试人员面孔。他们经常想从表格单元格或列表中找到一些值,并希望对相同的值执行操作或在同一块中找到相应的其他元素并对其执行操作。

http://qeworks.com/iterate-table-lists-selenium-webdriver/

于 2013-12-15T09:50:53.150 回答
0

//tbody/tr

这将为您提供行的总数-

//tbody/tr/td

这将为您提供上述行的所有单元格,您可以根据您的要求对其进行迭代。

于 2018-06-30T16:14:57.377 回答
0

我已经使用 Selenium C# 完成了这段代码TestComplete,并且现在已经用 Selenium C# 复制了它,我已经学会了这种艰难的方法,但它适用于任何表格控件,您不必对其中的任何xpath元素进行硬编码。此外,如果您有一个类似的嵌套表格控件td,例如,您有一个嵌套表格结构,其中您的数据解释如下(当您使用开发人员快速网格或角度网格控件时发生在复杂表格中)。这种情况下,如果您看到td标记再次具有嵌套表结构,该结构再次具有重复数据。您可以使用我在下面给出的代码捕获此类数据,也可以根据具体情况保留这些数据。

html

<table>
<tr>
  <td>Account #
      <table>
        <tr>
          <td>
            Account #
          </td>
        </tr>
      </table>
   </td>
   <td>Name 
      <table>
        <tr>
          <td>
            Name
          </td>
        </tr>
      </table>
   </td>
</tr>   
<tr>
   <td>1234 
      <table>
        <tr>
          <td>
              1234            
          </td>
        </tr>
      </table>
   </td>
    <td>Bharat
      <table>
        <tr>
          <td> 
           Bharat               
          </td>
        </tr>
      </table>
   </td>
</tr>
</table>

代码

  public List<TableDataCollection> StoreHtmlTableToList(IWebElement tblObj)
        {
            DataTable dataTbl = new DataTable();
            int rowIndex = 1;

            try
            {               
                _tblDataCollection = new List<TableDataCollection>();

                var tblRows = ((IJavaScriptExecutor)DriverContext.Driver).ExecuteScript("return arguments[0].rows; ", tblObj);

                if (tblRows != null)
                {
                    //Iterate through each row of the table
                    foreach (IWebElement tr in (IEnumerable)tblRows)
                    {                        
                        int colIndx = 1;
                        // Iterate through each cell of the table row
                        var tblCols = ((IJavaScriptExecutor)DriverContext.Driver).ExecuteScript("return arguments[0].cells; ", tr);
                        foreach (IWebElement td in (IEnumerable)tblCols)
                        {

                            //loop through any child or nested table structures if you want using the same approach

                            //Write Table to List : This part is not done yet

                            //Print the values
                            Console.WriteLine("Row[" + rowIndex.ToString() + "] Col[" + colIndx.ToString() + "] : " + td.Text);
                            colIndx++;
                        }
                        rowIndex++;
                    }

                }


            }
            catch (Exception)
            {
                throw;
            }
            return _tblDataCollection;
        }
于 2016-12-12T03:25:20.807 回答
0

@里彭·瓦西姆

下面的代码将帮助您逐列查找值

WebElement customtable = t.driver.findElement(By.cssSelector("div.custom-table"));
List<WebElement> r = customtable.findElements(By.tagName("tr"));
for (WebElement row : r) {
            List<WebElement> d = row.findElements(By.tagName("td"));            
            for(int i = 0; i<d.size(); i++) {
                if(i==0) {
                    WebElement x =d.get(i);
                    JavascriptExecutor js = (JavascriptExecutor) t.driver;
                    js.executeScript("arguments[0].scrollIntoView();", x);
                    System.out.println(i+"."+d.get(i).getText()+"\n");                  
                    if(d.get(i).getText().contains(searchtext)) {                       
                        System.out.println(i+".yes\n");
                    }
                    else
                    {
                        System.out.println("No\n");
                    }

                }
            }           
}

它为我工作。

于 2018-06-29T13:37:19.703 回答
0

以下是我们可以遵循的不同方法来处理应用程序中的动态数据[它不适用于动态元素];

  1. 使用excel方法;

    一个。获取字段的 web 元素

    湾。获取其文本。

    C。将数据存储在 excel 中并使用实际结果模式进行验证。

注意:Excel 中有多个数据验证选项,例如比较列、获取重复项等。

  1. 使用集合;

    一个。获取字段的 web 元素。

    湾。在集合中获取它的数据 [List, set, map etc]

    C。编写 java 代码来比较应用程序数据的模式。

        i.  Pattern can be data type, data length, data range ,Decimal places of amount field or other ,currency type, date and time pattern etc.
    
        ii. You can write the java conditions to verify the values of charts/graphs/dashboard if you are using in your application.
    

    d。比较实际数据模式[来自集合]和预期数据模式[来自 java 代码]

  2. 使用 JDBC API 通过数据库处理它,您可以在其中使用不同的命令检查实际数据。

于 2018-08-22T06:26:31.150 回答