Path: blob/trunk/java/test/org/openqa/selenium/ElementSelectingTest.java
1865 views
// Licensed to the Software Freedom Conservancy (SFC) under one1// or more contributor license agreements. See the NOTICE file2// distributed with this work for additional information3// regarding copyright ownership. The SFC licenses this file4// to you under the Apache License, Version 2.0 (the5// "License"); you may not use this file except in compliance6// with the License. You may obtain a copy of the License at7//8// http://www.apache.org/licenses/LICENSE-2.09//10// Unless required by applicable law or agreed to in writing,11// software distributed under the License is distributed on an12// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13// KIND, either express or implied. See the License for the14// specific language governing permissions and limitations15// under the License.1617package org.openqa.selenium;1819import static org.assertj.core.api.Assertions.assertThat;2021import org.junit.jupiter.api.Test;22import org.openqa.selenium.support.ui.ExpectedConditions;23import org.openqa.selenium.testing.JupiterTestBase;2425class ElementSelectingTest extends JupiterTestBase {26private static final boolean UNSELECTED = false;27private static final boolean SELECTED = true;2829@Test30void testShouldBeAbleToSelectAnEnabledUnselectedCheckbox() {31driver.get(pages.formPage);32assertCanSelect(enabledUnselectedCheckbox());33}3435@Test36void testShouldBeAbleToSelectAnEnabledUnselectedRadioButton() {37driver.get(pages.formPage);38assertCanSelect(enabledUnselectedRadioButton());39}4041@Test42void testShouldNotBeAbleToSelectADisabledCheckbox() {43driver.get(pages.formPage);44assertCannotSelect(disabledUnselectedCheckbox());45}4647@Test48void testShouldNotBeAbleToSelectADisabledCheckboxDisabledWithRandomString() {49driver.get(pages.formPage);50assertCannotSelect(randomlyDisabledSelectedCheckbox());51}5253@Test54void testShouldNotBeAbleToSelectADisabledRadioButton() {55driver.get(pages.formPage);56assertCannotSelect(disabledUnselectedRadioButton());57}5859@Test60void testShouldNotBeAbleToSelectADisabledRadioButtonDisabledWithRandomString() {61driver.get(pages.formPage);62assertCannotSelect(randomlyDisabledUnselectedRadioButton());63}6465@Test66void testSelectingRadioButtonShouldUnselectItsSibling() {67driver.get(pages.formPage);6869WebElement originallySelected = enabledSelectedRadioButton();70assertSelected(originallySelected);7172WebElement toSelect = enabledUnselectedRadioButton();73assertNotSelected(toSelect);7475toSelect.click();76assertNotSelected(originallySelected);77assertSelected(toSelect);78}7980@Test81void testShouldBeAbleToToggleAnEnabledUnselectedCheckbox() {82driver.get(pages.formPage);83assertCanToggle(enabledUnselectedCheckbox());84}8586@Test87void testShouldBeAbleToToggleAnEnabledSelectedCheckbox() {88driver.get(pages.formPage);89assertCanToggle(enabledSelectedCheckbox());90}9192@Test93void testClickingOnASelectedRadioButtonShouldLeaveItSelected() {94driver.get(pages.formPage);9596WebElement button = enabledSelectedRadioButton();97assertThat(button.isSelected()).isTrue();9899button.click();100101assertThat(button.isSelected()).isTrue();102}103104@Test105void testShouldBeAbleToToggleEnabledMultiSelectOption() {106driver.get(pages.formPage);107assertCanToggle(selectedMultipleSelectOption());108}109110@Test111void testShouldBeAbleToToggleSelectableCheckboxByClickingOnIt() {112driver.get(pages.formPage);113114WebElement checkbox = enabledUnselectedCheckbox();115assertNotSelected(checkbox);116117checkbox.click();118assertSelected(checkbox);119120checkbox.click();121assertNotSelected(checkbox);122}123124@Test125void testShouldBeAbleToSelectSelectableRadioButtonByClickingOnIt() {126driver.get(pages.formPage);127128WebElement radioButton = enabledUnselectedRadioButton();129assertNotSelected(radioButton);130131radioButton.click();132assertSelected(radioButton);133134radioButton.click();135assertSelected(radioButton);136}137138@Test139void testClickingDisabledSelectedCheckboxShouldBeNoop() {140driver.get(pages.formPage);141assertClickingPreservesCurrentlySelectedStatus(randomlyDisabledSelectedCheckbox());142}143144@Test145void testClickingDisabledUnselectedCheckboxShouldBeNoop() {146driver.get(pages.formPage);147assertClickingPreservesCurrentlySelectedStatus(disabledUnselectedCheckbox());148}149150@Test151void testClickingDisabledSelectedRadioButtonShouldBeNoop() {152driver.get(pages.formPage);153assertClickingPreservesCurrentlySelectedStatus(disabledSelectedRadioButton());154}155156@Test157void testClickingDisabledUnselectedRadioButtonShouldBeNoop() {158driver.get(pages.formPage);159assertClickingPreservesCurrentlySelectedStatus(disabledUnselectedRadioButton());160}161162private void assertNotSelected(WebElement element) {163assertSelected(element, UNSELECTED);164}165166private void assertSelected(WebElement element) {167assertSelected(element, SELECTED);168}169170private void assertSelected(WebElement element, boolean isSelected) {171wait.until(ExpectedConditions.elementSelectionStateToBe(element, isSelected));172assertThat(element.isSelected())173.describedAs(174"Expected element %s to be %s",175describe(element), selectedToString(isSelected), selectedToString(!isSelected))176.isEqualTo(isSelected);177}178179private void assertCannotSelect(WebElement element) {180boolean previous = element.isSelected();181element.click();182assertThat(element.isSelected()).isEqualTo(previous);183}184185private void assertCanSelect(WebElement element) {186assertNotSelected(element);187188element.click();189assertSelected(element);190}191192private void assertClickingPreservesCurrentlySelectedStatus(WebElement element) {193boolean currentSelectedStatus = element.isSelected();194element.click();195assertSelected(element, currentSelectedStatus);196}197198private static String selectedToString(boolean isSelected) {199return isSelected ? "[selected]" : "[not selected]";200}201202private static String describe(WebElement element) {203return element.getAttribute("id");204}205206private void assertCanToggle(WebElement element) {207final boolean originalState = element.isSelected();208209assertSelected(element, originalState);210211assertTogglingSwapsSelectedStateFrom(element, originalState);212assertTogglingSwapsSelectedStateFrom(element, !originalState);213}214215private void assertTogglingSwapsSelectedStateFrom(WebElement element, boolean originalState) {216element.click();217boolean isNowSelected = element.isSelected();218assertThat(isNowSelected)219.describedAs(220"Expected element %s to have been toggled to %s",221describe(element), selectedToString(!originalState))222.isEqualTo(!(originalState));223assertSelected(element, !originalState);224}225226// TODO: Test disabled multi-selects227// TODO: Test selecting options228229private WebElement enabledUnselectedCheckbox() {230return driver.findElement(By.id("checky"));231}232233private WebElement enabledSelectedCheckbox() {234return driver.findElement(By.id("checkedchecky"));235}236237private WebElement disabledUnselectedCheckbox() {238return driver.findElement(By.id("disabledchecky"));239}240241private WebElement randomlyDisabledSelectedCheckbox() {242return driver.findElement(By.id("randomly_disabled_checky"));243}244245private WebElement enabledUnselectedRadioButton() {246return driver.findElement(By.id("peas"));247}248249private WebElement enabledSelectedRadioButton() {250return driver.findElement(By.id("cheese_and_peas"));251}252253private WebElement disabledSelectedRadioButton() {254return driver.findElement(By.id("lone_disabled_selected_radio"));255}256257private WebElement disabledUnselectedRadioButton() {258return driver.findElement(By.id("nothing"));259}260261private WebElement randomlyDisabledUnselectedRadioButton() {262return driver.findElement(By.id("randomly_disabled_nothing"));263}264265private WebElement selectedMultipleSelectOption() {266WebElement select = driver.findElement(By.name("multi"));267return select.findElements(By.tagName("option")).get(0);268}269}270271272