I have a problem how to select a desired option (e.g. From, To...etc.) from list if 'datalist id' and 'select name' are randomly generated. This means that the ID and name has another value after refresh page. Here is a code for a first row, and 1st Field list:
It is a matter of proper xpath. You know the row and the column. You also know that the
select is under
datalist. The thing that is left to do is
N is the row number. You can extend this xpath so that it captures the particular option if you need.
Assuming that the class name of the td = field is unique for the page, you can use the below code to set "To" value in the select dropdown
IWebElement option = driver.FindElement(By.XPath("//*[@class='field']/datalist/select")); var selectElement = new SelectElement(option); selectElement.SelectByText("To");
If you add a new condition in a condition builder the searching rule will be at the end of the list. I'd be found the last condition-builer-form by following XPath:
After that, I'd be tried to navigate to the "To" field of the list:
const last_condition_form = find('(//datalist)[last()]') const select_field = last_condition_form.find('/select') select_field.select('To')
Please use the below solution. Maybe it will help.
For more detail click on below and search for "Types of XPath Functions"
Happy Testing :)
Instead of making "complex" XPaths I like to find a container I know the Id of. Then within that container search for in this case rows, within the second row search for a cell, within the cell find the dropdown.
var table = driver.FindElement(By.Id("advFilter")); var rows = table.FindElements(By.TagName("tr")); var cell = rows.FindElement(By.ClassName("field")); var dropdown = new SelectElement(cell.FindElement(By.TagName("select"))); dropdown.SelectByText("YourOption");
Now, this might be slower, but I don't think you will notice it. It will be much easier to understand and read in the future.