This table is complex because as you can see there is
A column with NO header
Two button with no unique identification properties
Check box in option column with no id or name, also there is no text J
We have used little advanced coding concepts of C#in this post, since this makes lines of codes reduced a lot as well. In this post we have used
Collections with custom classes
But, the code is clearly explained in the video below
Here is the complete video of the above discuss
Here is the complete code from the above video
public static void ReadTable(IWebElement table)
//Get all the columns from the table
var columns = table.FindElements(By.TagName("th"));
//Get all the rows
var rows = table.FindElements(By.TagName("tr"));
//Create row index
int rowIndex = 0;
foreach (var row in rows)
int colIndex = 0;
var colDatas = row.FindElements(By.TagName("td"));
foreach (var colValue in colDatas)
RowNumber = rowIndex,
ColumnName = columns[colIndex].Text != "" ?
columns[colIndex].Text : colIndex.ToString(),
ColumnValue = colValue.Text,
ColumnSpecialValues = colValue.Text != "" ? null :
//Move to next column
public static void PerformActionOnCell(string columnIndex, string refColumnName, string refColumnValue,
string controlToOperate = null)
foreach (int rowNumber in GetDynamicRowNumber(refColumnName, refColumnValue))
var cell = (from e in _tableDatacollections
where e.ColumnName == columnIndex && e.RowNumber == rowNumber
//Need to operate on those controls
if (controlToOperate != null && cell != null)
var returnedControl = (from c in cell
where c.GetAttribute("value") == controlToOperate
//ToDo: Currenly only click is supported, future is not taken care here
private static IEnumerable GetDynamicRowNumber(string columnName, string columnValue)
foreach (var table in _tableDatacollections)
if (table.ColumnName == columnName && table.ColumnValue == columnValue)
yield return table.RowNumber;
Thanks for reading the post and watching the video !!!
Please leave your comments and let me know if there is anything I should update in this post.
2 Replies to “Working with complex table using Selenium”
Firstly Great work on the tutorial!!
I have a slightly different scenario than the one you have explained in the video. It goes like
I have a table with a column without a name in which each cell consists of a checkbox. I have another column named “Format” which has a single image depending on the type of format(I have multiple images for different formats). Now my question is how can I check the checkbox(multiple rows) based on the image that is available in the “Format” column.
Note that I am dealing with two different ‘ColumnSpecialValues’ which are “img” and “input”. The only way I can distinguish between the format images are its src tag. I am not sure how I can pass this value to your ‘GetDynamicRowNumber’ method.
Hope I was clear on describing the scenario. Looking forward for you suggestions.
In GetDynamicRowNumber method, there is only one ColumnSpecialValue, you need to extend the method depending upon your need.
In your case, you need to create one more ColumnSpecialValue or may be List and based on that you can select the checkbox from all the columns you have the img. You need to use the columnoffset (index) to get the column which you need to deal with.
Hope this shed some lights on what you are looking for.