Reputation: 25
I want to select one element per row in a table. The rows and columns don't have that actual value, it's just for a test.
The cssSelector for the row is div.table_row.
The cssSelector for the cell is div.table_cell.
How can I randomly select one element out of those 5 columns per row and then move to the next row and select another element randomly?
I tried doing this but of course it failed:
Random rnd = new Random();
List<WebElement> button = driver.findElements(By.cssSelector(RADIO_BUTTON));
button.get(rnd.nextInt(button.size())).click();
Where RADIO_BUTTON is the cssSelector div.radio_button. This will randomly select 10 radio buttons and the test will fail.
See table image here.
Trying this in selenium in Java.
I am not familiar with parent and child elements in cssSelectors.
XPath is out of discussion since the classes are randomly generated and it will fail each time.
I want it to be something like this.
Thanks!
HTML page source:
<div class="sc-eIHaNI ccrdop">
<div id="question_container_54220043">
<div>
<div style="position: relative; overflow: hidden; width: auto; height: auto; min-height: 554px; max-height: 200px;">
<div style="position: relative; overflow: scroll; margin-right: -17px; margin-bottom: -17px; min-height: 571px; max-height: 217px;">
<div class="sc-dXLFzO oUzRG">
<div class="table sc-dlyikq fIjTup">
<div class="table_row sc-blIhvV iCLgRI">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk iezKaA">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text"></div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk ddQJUy">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">a</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk ddQJUy">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">b</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk ddQJUy">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">c</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk ddQJUy">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">d</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk ddQJUy">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">e</div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">1</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">2</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">3</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">4</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">5</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">6</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
<div class="table_row sc-blIhvV heofGg">
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-glUWqk bxqvJw">
<div class="sc-bTiqRo bfwdoK">
<div class="table_cell_text">
<div class="text" style="width: 100%;">7</div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
<div class="table_cell sc-bYTsla iuJcfM" width="100px">
<div class="sc-gQNndl ebzAHe">
<div class="sc-MYvYT jmUCao">
<div class="radio_button sc-hwwEjo eTTyml">
<div class="sc-kPVwWT eocRsE"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Upvotes: 2
Views: 620
Reputation: 5909
I can provide a bit of code to get you started. This code will first find all table rows, then pick a random cell per row to select. I don't actually see any radio_button
in the HTML you provided, so I am taking a guess and assuming <div class="table_cell_text"></div>
is the radio button element:
// init random
Random rnd = new Random();
// first get number of rows -- this returns 10
int rowCount = driver.findElements(By.xpath("//div[contains(@class, 'table_row')]")).size();
// then iterate the rows from 2-10 (WebElement lists are 1-based index, skip first header row)
for (int i = 2; i <= rowCount; i++)
{
// get radio buttons for this row -- use i to get the row index
// this returns 6
List<WebElement> cells = driver.findElements(By.xpath("//div[contains(@class, 'table_row')][" + i + "]//div[@class='table_cell_text']")
// get a random cell and click it -- start with 1 so we can skip first column
cells.get(rnd.nextInt((cells.size() - 1) + 1).click();
}
I started the for
loop at 2, because we don't want to look at the first row with the column headers a,b,c,d etc. I also specified rnd.nextInt
to pick between 1 and cells.size()
, so that we do not pick a cell that is in the first column with data 1,2,3,4 etc.
We use the line cells.get(rnd.nextInt((cells.size() - 1) + 1).click();
to ensure we are getting a list index that is greater than 0, but still within cells.size()
range. rnd.nextInt(cells.size()
returns an int
from 0 to cells.size()
. But, we want to skip the 0 case, so we add + 1
to the result. But, then we run into the out of bounds
potential issue, so we add - 1
to cells.size()
.
This code is actually requesting a random int from 0 to size() - 1
, then adding 1 to the result, so we get random int from 1 to size()
, which enables us to skip the first column of cells that we do not want to click.
Upvotes: 1
Reputation: 8676
You can try the approach like this:
List<WebElement> tableRows = driver.findElements(By.cssSelector("div.table_row"));
// iterating over rows
for(WebElement row: tableRows){
// Count number of cells in a row
List<WebElement> columsInRows = row.findElements(By.cssSelector("div.table_cell"));
Random rnd = new Random();
// Take random item in a row
int cellIndexToClick = rnd.nextInt(columsInRows.size());
// Click that item
columsInRows.get(cellIndexToClick).click();
}
Upvotes: 0