Uitableview Selenium Webdriver-获取表数据

Uitableview Selenium Webdriver-获取表数据,uitableview,selenium,webdriver,html-table,Uitableview,Selenium,Webdriver,Html Table,我想从UI中的表中获取数据。我知道使用“tr”和“td”循环行和列。但我桌上的那张是这样的: <table> <tbody> <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr> <tr><td>data</td><th>dat

我想从UI中的表中获取数据。我知道使用“tr”和“td”循环行和列。但我桌上的那张是这样的:

<table>
 <tbody>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
 </tbody>
</table>
<table>
  <tbody>
    <tr><th>Col1</th><th>Col2</th><th>Col3</th></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
  </tbody>
</table>
By tableBodyLocator = By.xpath(".//table/tbody");
By headerRowLocator = By.xpath(".//tr[position()=1]");
By dataRowsLocator = By.xpath(".//tr[not(position()=1)]");

By headerRowLocator = new ByChained(tableBodyLocator, headerRowLocator);
List<WebElement> weHeaders = driver.findElement(headerRowLocator)
       .findElements(By.xpath(".//th");
List<WebElement> allRowData = driver.findElements(tableBodyLocator, dataRowsLocator);

WebElement row1Data = allRowData.get(0);
WebElement row2Data = allRowData.get(1);

etc.

数据数据
数据数据
数据数据
如何使我的代码通用,以便处理中间出现的“TH”。 目前,我正在使用以下代码:

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

// 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"));
 for (WebElement cell : cells) {
 // And so on
 }
}
//抓住桌子
WebElement table=driver.findElement(By.id(searchResultsGrid));
//现在从表中获取所有TR元素
List allRows=table.findElements(按.tagName(“tr”));
//然后迭代它们,得到细胞
for(WebElement行:所有行){
列表单元格=行.findElements(按.tagName(“td”));
for(WebElement单元:单元){
//等等
}
}

您可以查找tr元素的所有子元素,而无需区分td和th。所以不是

List<WebElement> cells = row.findElements(By.tagName("td"));
List cells=row.findElements(按.tagName(“td”);
我会用

List<WebElement> cells = row.findElements(By.xpath("./*"));
List cells=row.findElements(By.xpath(“./*”);

也许对这个问题的负责人来说已经太晚了,但对其他人来说很有帮助

List<WebElement> cells = row.findElements(By.xpath(".//*[local-name(.)='th' or local-name(.)='td']"));
List cells=row.findElements(By.xpath(“./*[本地名(.)='th'或本地名(.)='td']);
是的,它正在为c#和selenium一起工作

IList<IWebElement> cells = row.findElements(By.xpath(".//*[local-name(.)='th' or local-name(.)='td']"));
IList cells=row.findElements(By.xpath(“./*[本地名(.)='th'或本地名(.)='td']);
//抓住桌子
WebElement table=driver.findElement(By.id(“searchResultsGrid”);
//现在从表中获取所有TR元素
List allRows=table.findElements(按.tagName(“tr”));
//然后迭代它们,得到细胞
for(WebElement行:所有行){
列表单元格=行.findElements(按.tagName(“td”));
for(WebElement单元:单元){
System.out.println(“content>>”+cell.getText());
}
}
使用
cell.getText()
只需简单地工作

IWebElement table=driver.FindElement(By.Id(“Id”);
IWebElement table = driver.FindElement(By.Id("id"));
List<IWebElement> allRows = new List<IWebElement> (table.FindElements(By.TagName("tr")));

foreach (var Row in allRows)
{
    List<IWebElement> cells = new List<IWebElement>( Row.FindElements(By.TagName("td")));
    foreach (var cel in cells)
    {
        string test = cel.Text;
    }
}
List allRows=新列表(table.FindElements(按.TagName(“tr”)); foreach(所有行中的变量行) { 列表单元格=新列表(Row.FindElements(按.TagName(“td”)); foreach(单元格中的var cel) { 字符串测试=cel.Text; } }
您不需要遍历元素。相反,请使用ByChained定位器

如果您的表格如下所示:

<table>
 <tbody>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
 </tbody>
</table>
<table>
  <tbody>
    <tr><th>Col1</th><th>Col2</th><th>Col3</th></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
  </tbody>
</table>
By tableBodyLocator = By.xpath(".//table/tbody");
By headerRowLocator = By.xpath(".//tr[position()=1]");
By dataRowsLocator = By.xpath(".//tr[not(position()=1)]");

By headerRowLocator = new ByChained(tableBodyLocator, headerRowLocator);
List<WebElement> weHeaders = driver.findElement(headerRowLocator)
       .findElements(By.xpath(".//th");
List<WebElement> allRowData = driver.findElements(tableBodyLocator, dataRowsLocator);

WebElement row1Data = allRowData.get(0);
WebElement row2Data = allRowData.get(1);

etc.

COL1 COL2COL3
数据
数据
数据
该系统如下所示:

<table>
 <tbody>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
 </tbody>
</table>
<table>
  <tbody>
    <tr><th>Col1</th><th>Col2</th><th>Col3</th></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
  </tbody>
</table>
By tableBodyLocator = By.xpath(".//table/tbody");
By headerRowLocator = By.xpath(".//tr[position()=1]");
By dataRowsLocator = By.xpath(".//tr[not(position()=1)]");

By headerRowLocator = new ByChained(tableBodyLocator, headerRowLocator);
List<WebElement> weHeaders = driver.findElement(headerRowLocator)
       .findElements(By.xpath(".//th");
List<WebElement> allRowData = driver.findElements(tableBodyLocator, dataRowsLocator);

WebElement row1Data = allRowData.get(0);
WebElement row2Data = allRowData.get(1);

etc.
By tableBodyLocator=By.xpath(“.//table/tbody”);
By headerRowLocator=By.xpath(“.//tr[position()=1]”);
By datarowslotor=By.xpath(“.//tr[not(position()=1)]”;
By headerRowLocator=新的ByChained(tableBodyLocator,headerRowLocator);
List weHeaders=driver.findElement(headerRowLocator)
.findElements(按.xpath(“.//th”);
列出allRowData=driver.findElements(tableBodyLocator、dataRowsLocator);
WebElement row1Data=allRowData.get(0);
WebElement row2Data=allRowData.get(1);
等

下面的代码您不仅可以获取表中的行和列,还可以获取它们在浏览器中的顺序,如果您在TD列中有嵌套结构,这将非常方便

 public DataTable StoreHtmlTableToDataTable(IWebElement tblObj,bool isFirstRowHeader = true)
        {
            DataTable dataTbl = new DataTable();
            int rowIndex = 0;

            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 = 0;
                        DataRow dtRow =  dataTbl.NewRow();
                        // 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)
                        {
                            //add the header row of the table as  the datatable column hader row
                            if (rowIndex == 0)
                            {
                                dataTbl.Columns.Add("Col" + colIndx.ToString(), typeof(string));
                            }

                            dtRow["Col"+colIndx.ToString()] = td.Text;

                            //loop through any child or nested table structures if you want using the same approach for example links,radio buttons etc inside the cell

                            //Write Table to List : This part is not done yet                           
                            colIndx++;
                        }
                        dataTbl.Rows.Add(dtRow);
                        rowIndex++;
                    }

                }


            }
            catch (Exception)
            {
                throw;
            }

            //if first row is the header row then assign it as a header of the datatable
            if (isFirstRowHeader)
            {
                dataTbl = this.AssignDataTableHeader(dataTbl);
            }

            return dataTbl;
        }
公共数据表存储HtmlTableToDataTable(IWebElement tblObj,bool isFirstRowHeader=true)
{
DataTable dataTbl=新的DataTable();
int rowIndex=0;
尝试
{               
//_tblDataCollection=新列表();
var tblRows=((IJavaScriptExecutor)DriverContext.Driver).ExecuteScript(“返回参数[0].rows;”,tblObj);
如果(tblRows!=null)
{
//遍历表的每一行
foreach(IWebElement tr in(IEnumerable)tblRows)
{                        
int colIndx=0;
DataRow dtRow=dataTbl.NewRow();
//遍历表行的每个单元格
var tblCols=((IJavaScriptExecutor)DriverContext.Driver).ExecuteScript(“返回参数[0].cells;”,tr);
foreach(IWebElement td in(IEnumerable)tblCols)
{
//将表的标题行添加为datatable列hader行
如果(行索引==0)
{
dataTbl.Columns.Add(“Col”+colIndx.ToString(),typeof(string));
}
dtRow[“Col”+colIndx.ToString()]=td.Text;
//如果希望在单元格内使用相同的方法(例如链接、单选按钮等),则可以循环任何子表或嵌套表结构
//将表格写入列表:此部分尚未完成
colIndx++;
}
dataTbl.Rows.Add(dtRow);
rowIndex++;
}
}
}
捕获(例外)
{
投掷;
}
//如果第一行是标题行,则将其指定为datatable的标题
如果(isFirstRowHeader)
{
dataTbl=此.AssignDataTableHeader(dataTbl);
}
返回数据TBL;
}
TableDriver()支持同时带有td和th标记的单元格。将TableDriver与示例表一起使用,如下所示:

<table>
 <tbody>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
  <tr><td>data</td><th>data</th><td>data</td><td>data</td></tr>
 </tbody>
</table>
<table>
  <tbody>
    <tr><th>Col1</th><th>Col2</th><th>Col3</th></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
    <tr><td>data</td><td>data</td><td>data</td></tr>
  </tbody>
</table>
By tableBodyLocator = By.xpath(".//table/tbody");
By headerRowLocator = By.xpath(".//tr[position()=1]");
By dataRowsLocator = By.xpath(".//tr[not(position()=1)]");

By headerRowLocator = new ByChained(tableBodyLocator, headerRowLocator);
List<WebElement> weHeaders = driver.findElement(headerRowLocator)
       .findElements(By.xpath(".//th");
List<WebElement> allRowData = driver.findElements(tableBodyLocator, dataRowsLocator);

WebElement row1Data = allRowData.get(0);
WebElement row2Data = allRowData.get(1);

etc.
Table Table=Table.createWithNoHeaders(driver.findElement(By.id(searchResultsGrid))0;
List allRows=table.getRows();
for(TableRow行:所有行){
List cells=row.getCells();
用于(表格单元格:单元格){
//按如下方式访问单元格的WebElement:cell.getElement()
}
}

但这将为所有子项(包括链接或输入等)提供内部设置。我的示例将只返回第一级子项。这意味着仅返回tr和th标记(参考