动态表数据检索 - selenium webdriver

时间:2013-04-11 06:31:23

标签: java selenium selenium-webdriver testng

<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">。如何检索上述格式化表格的表格数据?

9 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分: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);

  }

答案 2 :(得分:1)

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

2。捕获表行计数实际数据所在的行。   [-从我的角度来看,我需要第一行数据本身,因此我很难将其编码为零。   如果需要,请在现有代码中添加一个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;

}

答案 3 :(得分:0)

你有很多选择,但这是我的选择。 你把所有的tds都列入一个清单。

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

如果您想拥有该值,可以使用循环。

for(WebElement el: tdlist)  {
    Systeme.out.println(el.getText());   
}

答案 4 :(得分:0)

看看这个 最常见的Challenge Automation测试人员在迭代表和列表时会面临。他们经常想从表格单元格或列表中找到一些值,并希望对同一个值执行操作或在同一个块中找到相应的其他元素并对其执行操作。

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

答案 5 :(得分:0)

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

HTML

td

代码

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

答案 6 :(得分:0)

@ Ripon Al Wasim

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

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

                }
            }           
}

它为我工作。

答案 7 :(得分:0)

// tbody / tr

这将为您提供总行数-

// tbody / tr / td

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

答案 8 :(得分:0)

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

  1. 使用excel方法;

    a。获取该字段的网络元素

    b。获取其文本。

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

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

  1. 使用集合;

    a。获取该字段的网络元素。

    b。在集合[列表,集合,地图等]中获取其数据

    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通过数据库进行处理,您可以在数据库中使用不同的命令检查实际数据。