blob: 5a663902deee9345cbfae429157f8eb0e1c17e77 [file] [log] [blame] [edit]
// <copyright file="ElementSelectingTest.cs" company="Selenium Committers">
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// </copyright>
using NUnit.Framework;
namespace OpenQA.Selenium;
[TestFixture]
public class ElementSelectingTest : DriverTestFixture
{
private const string assertCannotPerformActionFormat_action_element = "Expected exception - should not be able to {0} element {1}";
[Test]
public void ShouldBeAbleToSelectAnEnabledUnselectedCheckbox()
{
driver.Url = formsPage;
AssertCanSelect(this.EnabledUnselectedCheckbox);
}
[Test]
public void ShouldBeAbleToSelectAnEnabledUnselectedRadioButton()
{
driver.Url = formsPage;
AssertCanSelect(this.EnabledUnselectedRadioButton);
}
[Test]
public void ShouldNotBeAbleToSelectADisabledCheckbox()
{
driver.Url = formsPage;
AssertCannotSelect(this.DisabledUnselectedCheckbox);
}
[Test]
public void ShouldNotBeAbleToSelectADisabledCheckboxDisabledWithRandomString()
{
driver.Url = formsPage;
AssertCannotSelect(this.RandomlyDisabledSelectedCheckbox);
}
[Test]
public void ShouldNotBeAbleToSelectADisabledRadioButton()
{
driver.Url = formsPage;
AssertCannotSelect(this.DisabledUnselectedRadioButton);
}
[Test]
public void ShouldNotBeAbleToSelectADisabledRadioButtonDisabledWithRandomString()
{
driver.Url = formsPage;
AssertCannotSelect(this.RandomlyDisabledUnselectedRadioButton);
}
[Test]
public void SelectingRadioButtonShouldUnselectItsSibling()
{
driver.Url = formsPage;
IWebElement originallySelected = this.EnabledSelectedRadioButton;
AssertSelected(originallySelected);
IWebElement toSelect = this.EnabledUnselectedRadioButton;
AssertNotSelected(toSelect);
toSelect.Click();
AssertNotSelected(originallySelected);
AssertSelected(toSelect);
}
[Test]
public void ShouldBeAbleToToggleAnEnabledUnselectedCheckbox()
{
driver.Url = formsPage;
IWebElement checkbox = this.EnabledUnselectedCheckbox;
AssertNotSelected(checkbox);
checkbox.Click();
AssertSelected(checkbox);
checkbox.Click();
AssertNotSelected(checkbox);
}
[Test]
public void ShouldBeAbleToToggleAnEnabledSelectedCheckbox()
{
driver.Url = formsPage;
IWebElement checkbox = this.EnabledSelectedCheckbox;
AssertSelected(checkbox);
checkbox.Click();
AssertNotSelected(checkbox);
checkbox.Click();
AssertSelected(checkbox);
}
[Test]
public void ClickingOnASelectedRadioButtonShouldLeaveItSelected()
{
driver.Url = formsPage;
IWebElement button = this.EnabledSelectedRadioButton;
Assert.That(button.Selected, "Radio button should be selected");
button.Click();
Assert.That(button.Selected, "Radio button should be selected");
}
[Test]
public void ShouldBeAbleToToggleEnabledMultiSelectOption()
{
driver.Url = formsPage;
AssertCanToggle(this.SelectedMultipleSelectOption);
}
[Test]
public void ShouldBeAbleToToggleSelectableCheckboxByClickingOnIt()
{
driver.Url = formsPage;
IWebElement checkbox = this.EnabledUnselectedCheckbox;
AssertNotSelected(checkbox);
checkbox.Click();
AssertSelected(checkbox);
checkbox.Click();
AssertNotSelected(checkbox);
}
[Test]
public void ShouldBeAbleToSelectSelectableRadioButtonByClickingOnIt()
{
driver.Url = formsPage;
IWebElement radioButton = this.EnabledUnselectedRadioButton;
AssertNotSelected(radioButton);
radioButton.Click();
AssertSelected(radioButton);
radioButton.Click();
AssertSelected(radioButton);
}
[Test]
public void ClickingDisabledSelectedCheckboxShouldBeNoop()
{
driver.Url = formsPage;
AssertClickingPreservesCurrentlySelectedStatus(this.RandomlyDisabledSelectedCheckbox);
}
[Test]
public void ClickingDisabledUnselectedCheckboxShouldBeNoop()
{
driver.Url = formsPage;
AssertClickingPreservesCurrentlySelectedStatus(this.DisabledUnselectedCheckbox);
}
[Test]
public void ClickingDisabledSelectedRadioButtonShouldBeNoop()
{
driver.Url = formsPage;
AssertClickingPreservesCurrentlySelectedStatus(this.DisabledSelectedRadioButton);
}
[Test]
public void ClickingDisabledUnselectedRadioButtonShouldBeNoop()
{
driver.Url = formsPage;
AssertClickingPreservesCurrentlySelectedStatus(this.DisabledUnselectedRadioButton);
}
private static void AssertNotSelected(IWebElement element)
{
AssertSelected(element, false);
}
private static void AssertSelected(IWebElement element)
{
AssertSelected(element, true);
}
private static void AssertSelected(IWebElement element, bool isSelected)
{
Assert.That(element.Selected, Is.EqualTo(isSelected), string.Format("Expected element {0} to be {1} but was {2}", Describe(element), SelectedToString(isSelected), SelectedToString(!isSelected)));
}
private static void AssertCannotSelect(IWebElement element)
{
bool previous = element.Selected;
element.Click();
Assert.That(element.Selected, Is.EqualTo(previous));
}
private static void AssertCanSelect(IWebElement element)
{
AssertNotSelected(element);
element.Click();
AssertSelected(element);
}
private static void AssertClickingPreservesCurrentlySelectedStatus(IWebElement element)
{
bool currentSelectedStatus = element.Selected;
try
{
element.Click();
}
catch (InvalidElementStateException)
{
// This is expected, as we are clicking disabled elements.
}
AssertSelected(element, currentSelectedStatus);
}
private static string SelectedToString(bool isSelected)
{
return isSelected ? "[selected]" : "[not selected]";
}
private static string Describe(IWebElement element)
{
return element.GetAttribute("id");
}
private static void AssertCanToggle(IWebElement element)
{
bool originalState = element.Selected;
AssertSelected(element, originalState);
AssertTogglingSwapsSelectedStateFrom(element, originalState);
AssertTogglingSwapsSelectedStateFrom(element, !originalState);
}
private static void AssertTogglingSwapsSelectedStateFrom(IWebElement element, bool originalState)
{
element.Click();
bool isNowSelected = element.Selected;
Assert.That(originalState, Is.Not.EqualTo(isNowSelected), string.Format("Expected element {0} to have been toggled to {1} but was {2}", Describe(element), SelectedToString(!originalState), SelectedToString(originalState)));
AssertSelected(element, !originalState);
}
//TODO: Test disabled multi-selects
//TODO: Test selecting options
private IWebElement EnabledUnselectedCheckbox
{
get
{
return driver.FindElement(By.Id("checky"));
}
}
private IWebElement EnabledSelectedCheckbox
{
get
{
return driver.FindElement(By.Id("checkedchecky"));
}
}
private IWebElement DisabledUnselectedCheckbox
{
get
{
return driver.FindElement(By.Id("disabledchecky"));
}
}
private IWebElement RandomlyDisabledSelectedCheckbox
{
get
{
return driver.FindElement(By.Id("randomly_disabled_checky"));
}
}
private IWebElement EnabledUnselectedRadioButton
{
get
{
return driver.FindElement(By.Id("peas"));
}
}
private IWebElement EnabledSelectedRadioButton
{
get
{
return driver.FindElement(By.Id("cheese_and_peas"));
}
}
private IWebElement DisabledSelectedRadioButton
{
get
{
return driver.FindElement(By.Id("lone_disabled_selected_radio"));
}
}
private IWebElement DisabledUnselectedRadioButton
{
get
{
return driver.FindElement(By.Id("nothing"));
}
}
private IWebElement RandomlyDisabledUnselectedRadioButton
{
get
{
return driver.FindElement(By.Id("randomly_disabled_nothing"));
}
}
private IWebElement SelectedMultipleSelectOption
{
get
{
IWebElement select = driver.FindElement(By.Name("multi"));
return select.FindElements(By.TagName("option"))[0];
}
}
private IWebElement NonSelectableElement
{
get
{
return driver.FindElement(By.TagName("div"));
}
}
}