【问题标题】:dynamic table data retrieve - selenium webdriver动态表数据检索 - selenium webdriver
【发布时间】:2013-04-11 06:31:23
【问题描述】:
<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 类名都相同:&lt;tr class="row0"&gt;。如何检索上述格式化表格的表格数据?

【问题讨论】:

    标签: java selenium selenium-webdriver testng


    【解决方案1】:

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

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

    【讨论】:

    • 我只想从每行的第二列获取数据。我该怎么做?
    【解决方案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);
    
      }
    

    【讨论】:

      【解决方案3】:

      动态表格数据捕获: 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;
      
      }
      

      【讨论】:

        【解决方案4】:

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

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

        如果你想获得价值,你可以使用循环。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            我已经使用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;
                    }
            

            【讨论】:

              【解决方案7】:

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

              它对我有用。

              【讨论】:

                【解决方案8】:

                //tbody/tr

                这会给你行的总数-

                //tbody/tr/td

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

                【讨论】:

                  【解决方案9】:

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

                  1. 使用excel方法;

                    一个。获取字段的web-element

                    b.获取其文本。

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

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

                  1. 使用集合;

                    一个。获取字段的网络元素。

                    b.获取集合中的数据 [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通过数据库处理,可以通过不同的命令查看实际数据。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-08-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-05-24
                    • 1970-01-01
                    相关资源
                    最近更新 更多