Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/java/test/org/openqa/selenium/ElementSelectingTest.java
1865 views
1
// Licensed to the Software Freedom Conservancy (SFC) under one
2
// or more contributor license agreements. See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership. The SFC licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License. You may obtain a copy of the License at
8
//
9
// http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied. See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
package org.openqa.selenium;
19
20
import static org.assertj.core.api.Assertions.assertThat;
21
22
import org.junit.jupiter.api.Test;
23
import org.openqa.selenium.support.ui.ExpectedConditions;
24
import org.openqa.selenium.testing.JupiterTestBase;
25
26
class ElementSelectingTest extends JupiterTestBase {
27
private static final boolean UNSELECTED = false;
28
private static final boolean SELECTED = true;
29
30
@Test
31
void testShouldBeAbleToSelectAnEnabledUnselectedCheckbox() {
32
driver.get(pages.formPage);
33
assertCanSelect(enabledUnselectedCheckbox());
34
}
35
36
@Test
37
void testShouldBeAbleToSelectAnEnabledUnselectedRadioButton() {
38
driver.get(pages.formPage);
39
assertCanSelect(enabledUnselectedRadioButton());
40
}
41
42
@Test
43
void testShouldNotBeAbleToSelectADisabledCheckbox() {
44
driver.get(pages.formPage);
45
assertCannotSelect(disabledUnselectedCheckbox());
46
}
47
48
@Test
49
void testShouldNotBeAbleToSelectADisabledCheckboxDisabledWithRandomString() {
50
driver.get(pages.formPage);
51
assertCannotSelect(randomlyDisabledSelectedCheckbox());
52
}
53
54
@Test
55
void testShouldNotBeAbleToSelectADisabledRadioButton() {
56
driver.get(pages.formPage);
57
assertCannotSelect(disabledUnselectedRadioButton());
58
}
59
60
@Test
61
void testShouldNotBeAbleToSelectADisabledRadioButtonDisabledWithRandomString() {
62
driver.get(pages.formPage);
63
assertCannotSelect(randomlyDisabledUnselectedRadioButton());
64
}
65
66
@Test
67
void testSelectingRadioButtonShouldUnselectItsSibling() {
68
driver.get(pages.formPage);
69
70
WebElement originallySelected = enabledSelectedRadioButton();
71
assertSelected(originallySelected);
72
73
WebElement toSelect = enabledUnselectedRadioButton();
74
assertNotSelected(toSelect);
75
76
toSelect.click();
77
assertNotSelected(originallySelected);
78
assertSelected(toSelect);
79
}
80
81
@Test
82
void testShouldBeAbleToToggleAnEnabledUnselectedCheckbox() {
83
driver.get(pages.formPage);
84
assertCanToggle(enabledUnselectedCheckbox());
85
}
86
87
@Test
88
void testShouldBeAbleToToggleAnEnabledSelectedCheckbox() {
89
driver.get(pages.formPage);
90
assertCanToggle(enabledSelectedCheckbox());
91
}
92
93
@Test
94
void testClickingOnASelectedRadioButtonShouldLeaveItSelected() {
95
driver.get(pages.formPage);
96
97
WebElement button = enabledSelectedRadioButton();
98
assertThat(button.isSelected()).isTrue();
99
100
button.click();
101
102
assertThat(button.isSelected()).isTrue();
103
}
104
105
@Test
106
void testShouldBeAbleToToggleEnabledMultiSelectOption() {
107
driver.get(pages.formPage);
108
assertCanToggle(selectedMultipleSelectOption());
109
}
110
111
@Test
112
void testShouldBeAbleToToggleSelectableCheckboxByClickingOnIt() {
113
driver.get(pages.formPage);
114
115
WebElement checkbox = enabledUnselectedCheckbox();
116
assertNotSelected(checkbox);
117
118
checkbox.click();
119
assertSelected(checkbox);
120
121
checkbox.click();
122
assertNotSelected(checkbox);
123
}
124
125
@Test
126
void testShouldBeAbleToSelectSelectableRadioButtonByClickingOnIt() {
127
driver.get(pages.formPage);
128
129
WebElement radioButton = enabledUnselectedRadioButton();
130
assertNotSelected(radioButton);
131
132
radioButton.click();
133
assertSelected(radioButton);
134
135
radioButton.click();
136
assertSelected(radioButton);
137
}
138
139
@Test
140
void testClickingDisabledSelectedCheckboxShouldBeNoop() {
141
driver.get(pages.formPage);
142
assertClickingPreservesCurrentlySelectedStatus(randomlyDisabledSelectedCheckbox());
143
}
144
145
@Test
146
void testClickingDisabledUnselectedCheckboxShouldBeNoop() {
147
driver.get(pages.formPage);
148
assertClickingPreservesCurrentlySelectedStatus(disabledUnselectedCheckbox());
149
}
150
151
@Test
152
void testClickingDisabledSelectedRadioButtonShouldBeNoop() {
153
driver.get(pages.formPage);
154
assertClickingPreservesCurrentlySelectedStatus(disabledSelectedRadioButton());
155
}
156
157
@Test
158
void testClickingDisabledUnselectedRadioButtonShouldBeNoop() {
159
driver.get(pages.formPage);
160
assertClickingPreservesCurrentlySelectedStatus(disabledUnselectedRadioButton());
161
}
162
163
private void assertNotSelected(WebElement element) {
164
assertSelected(element, UNSELECTED);
165
}
166
167
private void assertSelected(WebElement element) {
168
assertSelected(element, SELECTED);
169
}
170
171
private void assertSelected(WebElement element, boolean isSelected) {
172
wait.until(ExpectedConditions.elementSelectionStateToBe(element, isSelected));
173
assertThat(element.isSelected())
174
.describedAs(
175
"Expected element %s to be %s",
176
describe(element), selectedToString(isSelected), selectedToString(!isSelected))
177
.isEqualTo(isSelected);
178
}
179
180
private void assertCannotSelect(WebElement element) {
181
boolean previous = element.isSelected();
182
element.click();
183
assertThat(element.isSelected()).isEqualTo(previous);
184
}
185
186
private void assertCanSelect(WebElement element) {
187
assertNotSelected(element);
188
189
element.click();
190
assertSelected(element);
191
}
192
193
private void assertClickingPreservesCurrentlySelectedStatus(WebElement element) {
194
boolean currentSelectedStatus = element.isSelected();
195
element.click();
196
assertSelected(element, currentSelectedStatus);
197
}
198
199
private static String selectedToString(boolean isSelected) {
200
return isSelected ? "[selected]" : "[not selected]";
201
}
202
203
private static String describe(WebElement element) {
204
return element.getAttribute("id");
205
}
206
207
private void assertCanToggle(WebElement element) {
208
final boolean originalState = element.isSelected();
209
210
assertSelected(element, originalState);
211
212
assertTogglingSwapsSelectedStateFrom(element, originalState);
213
assertTogglingSwapsSelectedStateFrom(element, !originalState);
214
}
215
216
private void assertTogglingSwapsSelectedStateFrom(WebElement element, boolean originalState) {
217
element.click();
218
boolean isNowSelected = element.isSelected();
219
assertThat(isNowSelected)
220
.describedAs(
221
"Expected element %s to have been toggled to %s",
222
describe(element), selectedToString(!originalState))
223
.isEqualTo(!(originalState));
224
assertSelected(element, !originalState);
225
}
226
227
// TODO: Test disabled multi-selects
228
// TODO: Test selecting options
229
230
private WebElement enabledUnselectedCheckbox() {
231
return driver.findElement(By.id("checky"));
232
}
233
234
private WebElement enabledSelectedCheckbox() {
235
return driver.findElement(By.id("checkedchecky"));
236
}
237
238
private WebElement disabledUnselectedCheckbox() {
239
return driver.findElement(By.id("disabledchecky"));
240
}
241
242
private WebElement randomlyDisabledSelectedCheckbox() {
243
return driver.findElement(By.id("randomly_disabled_checky"));
244
}
245
246
private WebElement enabledUnselectedRadioButton() {
247
return driver.findElement(By.id("peas"));
248
}
249
250
private WebElement enabledSelectedRadioButton() {
251
return driver.findElement(By.id("cheese_and_peas"));
252
}
253
254
private WebElement disabledSelectedRadioButton() {
255
return driver.findElement(By.id("lone_disabled_selected_radio"));
256
}
257
258
private WebElement disabledUnselectedRadioButton() {
259
return driver.findElement(By.id("nothing"));
260
}
261
262
private WebElement randomlyDisabledUnselectedRadioButton() {
263
return driver.findElement(By.id("randomly_disabled_nothing"));
264
}
265
266
private WebElement selectedMultipleSelectOption() {
267
WebElement select = driver.findElement(By.name("multi"));
268
return select.findElements(By.tagName("option")).get(0);
269
}
270
}
271
272