Path: blob/trunk/dotnet/test/support/UI/SelectTests.cs
4505 views
// <copyright file="SelectTests.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 System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Reflection;
using Moq;
using NUnit.Framework;
namespace OpenQA.Selenium.Support.UI;
[TestFixture]
public class SelectTests
{
private Mock<IWebElement> webElement;
[SetUp]
public void SetUp()
{
webElement = new Mock<IWebElement>();
}
[Test]
public void ThrowUnexpectedTagNameExceptionWhenNotSelectTag()
{
webElement.SetupGet<string>(_ => _.TagName).Returns("form");
Assert.That(
() => new SelectElement(webElement.Object),
Throws.TypeOf<UnexpectedTagNameException>());
}
[Test]
public void CanCreateNewInstanceOfSelectWithNormalSelectElement()
{
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns((string)null);
Assert.That(new SelectElement(webElement.Object).IsMultiple, Is.False);
}
[Test]
public void CanCreateNewInstanceOfSelectWithMultipleSelectElement()
{
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
Assert.That(new SelectElement(webElement.Object).IsMultiple, Is.True);
}
[Test]
public void CanGetListOfOptions()
{
IList<IWebElement> options = new List<IWebElement>();
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options));
Assert.That(new SelectElement(webElement.Object).Options, Is.EqualTo(options));
}
[Test]
public void CanGetSingleSelectedOption()
{
Mock<IWebElement> selected = new Mock<IWebElement>();
Mock<IWebElement> notSelected = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(notSelected.Object);
options.Add(selected.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
notSelected.SetupGet<bool>(_ => _.Selected).Returns(false);
selected.SetupGet<bool>(_ => _.Selected).Returns(true);
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
IWebElement option = new SelectElement(webElement.Object).SelectedOption;
Assert.That(option, Is.EqualTo(selected.Object));
notSelected.Verify(_ => _.Selected, Times.Once);
selected.Verify(_ => _.Selected, Times.Once);
webElement.Verify();
}
[Test]
public void CanGetAllSelectedOptions()
{
Mock<IWebElement> selected = new Mock<IWebElement>();
Mock<IWebElement> notSelected = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(selected.Object);
options.Add(notSelected.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
notSelected.SetupGet<bool>(_ => _.Selected).Returns(false);
selected.SetupGet<bool>(_ => _.Selected).Returns(true);
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
IList<IWebElement> returnedOption = new SelectElement(webElement.Object).AllSelectedOptions;
Assert.That(returnedOption, Has.Count.EqualTo(1));
Assert.That(returnedOption[0], Is.EqualTo(selected.Object));
notSelected.Verify(_ => _.Selected, Times.Once);
selected.Verify(_ => _.Selected, Times.Once);
webElement.Verify();
}
[Test]
public void CanSetSingleOptionSelectedByText()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(false);
option1.SetupGet<bool>(_ => _.Enabled).Returns(true);
option1.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).SelectByText("Select Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
webElement.Verify();
}
[Test]
public void CanSetSingleOptionSelectedByValue()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns((string)null);
option1.SetupGet<bool>(_ => _.Selected).Returns(false);
option1.SetupGet<bool>(_ => _.Enabled).Returns(true);
option1.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).SelectByValue("Select Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
webElement.Verify();
}
[Test]
public void CanSetSingleOptionSelectedByIndex()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns((string)null);
option1.Setup<string>(_ => _.GetAttribute(It.IsAny<string>())).Returns("2");
option1.SetupGet<bool>(_ => _.Selected).Returns(false);
option1.SetupGet<bool>(_ => _.Enabled).Returns(true);
option1.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).SelectByIndex(2);
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
option1.Verify(_ => _.GetAttribute(It.IsAny<string>()), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanSetMultipleOptionSelectedByText()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
Mock<IWebElement> option2 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
options.Add(option2.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(false);
option1.SetupGet<bool>(_ => _.Enabled).Returns(true);
option1.Setup(_ => _.Click());
option2.SetupGet<bool>(_ => _.Selected).Returns(false);
option2.SetupGet<bool>(_ => _.Enabled).Returns(true);
option2.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).SelectByText("Select Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
option2.Verify(_ => _.Selected, Times.Once);
option2.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanSetMultipleOptionSelectedByValue()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
Mock<IWebElement> option2 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
options.Add(option2.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(false);
option1.SetupGet<bool>(_ => _.Enabled).Returns(true);
option1.Setup(_ => _.Click());
option2.SetupGet<bool>(_ => _.Selected).Returns(false);
option2.SetupGet<bool>(_ => _.Enabled).Returns(true);
option2.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).SelectByValue("Select Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
option2.Verify(_ => _.Selected, Times.Once);
option2.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanSetMultipleOptionSelectedByIndex()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
Mock<IWebElement> option2 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
options.Add(option2.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.Setup<string>(_ => _.GetAttribute(It.IsAny<string>())).Returns("1");
option1.SetupGet<bool>(_ => _.Selected).Returns(false);
option1.SetupGet<bool>(_ => _.Enabled).Returns(true);
option1.Setup(_ => _.Click());
option2.Setup<string>(_ => _.GetAttribute(It.IsAny<string>())).Returns("2");
option2.SetupGet<bool>(_ => _.Selected).Returns(false);
option2.SetupGet<bool>(_ => _.Enabled).Returns(true);
option2.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).SelectByIndex(2);
option1.Verify(_ => _.Selected, Times.Never);
option1.Verify(_ => _.Click(), Times.Never);
option1.Verify(_ => _.GetAttribute(It.IsAny<string>()), Times.Once);
option2.Verify(_ => _.Selected, Times.Once);
option2.Verify(_ => _.Click(), Times.Once);
option2.Verify(_ => _.GetAttribute(It.IsAny<string>()), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanDeselectSingleOptionSelectedByText()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(true);
option1.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).DeselectByText("Deselect Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanDeselectSingleOptionSelectedByValue()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(true);
option1.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).DeselectByValue("Deselect Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanDeselectSingleOptionSelectedByIndex()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.Setup<string>(_ => _.GetAttribute(It.IsAny<string>())).Returns("2");
option1.SetupGet<bool>(_ => _.Selected).Returns(true);
option1.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).DeselectByIndex(2);
option1.Verify(_ => _.GetAttribute(It.IsAny<string>()), Times.Once);
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanDeselectMultipleOptionSelectedByText()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
Mock<IWebElement> option2 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
options.Add(option2.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(true);
option1.Setup(_ => _.Click());
option2.SetupGet<bool>(_ => _.Selected).Returns(true);
option2.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).DeselectByText("Deselect Me");
}
[Test]
public void CanDeselectMultipleOptionSelectedByValue()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
Mock<IWebElement> option2 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
options.Add(option2.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.SetupGet<bool>(_ => _.Selected).Returns(true);
option1.Setup(_ => _.Click());
option2.SetupGet<bool>(_ => _.Selected).Returns(true);
option2.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).DeselectByValue("Deselect Me");
option1.Verify(_ => _.Selected, Times.Once);
option1.Verify(_ => _.Click(), Times.Once);
option2.Verify(_ => _.Selected, Times.Once);
option2.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void CanDeselectMultipleOptionSelectedByIndex()
{
Mock<IWebElement> option1 = new Mock<IWebElement>();
Mock<IWebElement> option2 = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(option1.Object);
options.Add(option2.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
option1.Setup<string>(_ => _.GetAttribute(It.IsAny<string>())).Returns("1");
option1.SetupGet<bool>(_ => _.Selected).Returns(true);
option1.Setup(_ => _.Click());
option2.Setup<string>(_ => _.GetAttribute(It.IsAny<string>())).Returns("2");
option2.SetupGet<bool>(_ => _.Selected).Returns(true);
option2.Setup(_ => _.Click());
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
new SelectElement(webElement.Object).DeselectByIndex(2);
option1.Verify(_ => _.GetAttribute(It.IsAny<string>()), Times.Once);
option1.Verify(_ => _.Selected, Times.Never);
option1.Verify(_ => _.Click(), Times.Never);
option2.Verify(_ => _.GetAttribute(It.IsAny<string>()), Times.Once);
option2.Verify(_ => _.Selected, Times.Once);
option2.Verify(_ => _.Click(), Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void SelectedOptionPropertyShouldThrowExceptionWhenNoOptionSelected()
{
Mock<IWebElement> selected = new Mock<IWebElement>();
Mock<IWebElement> notSelected = new Mock<IWebElement>();
IList<IWebElement> options = new List<IWebElement>();
options.Add(notSelected.Object);
webElement.SetupGet<string>(_ => _.TagName).Returns("select");
webElement.Setup(_ => _.GetAttribute(It.Is<string>(x => x == "multiple"))).Returns("true");
notSelected.SetupGet<bool>(_ => _.Selected).Returns(false);
webElement.Setup(_ => _.FindElements(It.IsAny<By>())).Returns(new ReadOnlyCollection<IWebElement>(options)).Verifiable();
SelectElement element = new SelectElement(webElement.Object);
Assert.That(
() => element.SelectedOption,
Throws.TypeOf<NoSuchElementException>());
notSelected.Verify(_ => _.Selected, Times.Once);
webElement.Verify(_ => _.FindElements(It.IsAny<By>()), Times.Once);
}
[Test]
public void ShouldConvertAnUnquotedStringIntoOneWithQuotes()
{
string result = EscapeQuotes("foo");
Assert.That(result, Is.EqualTo("\"foo\""));
}
[Test]
public void ShouldConvertAStringWithATickIntoOneWithQuotes()
{
string result = EscapeQuotes("f'oo");
Assert.That(result, Is.EqualTo("\"f'oo\""));
}
[Test]
public void ShouldConvertAStringWithAQuotIntoOneWithTicks()
{
string result = EscapeQuotes("f\"oo");
Assert.That(result, Is.EqualTo("'f\"oo'"));
}
[Test]
public void ShouldProvideConcatenatedStringsWhenStringToEscapeContainsTicksAndQuotes()
{
string result = EscapeQuotes("f\"o'o");
Assert.That(result, Is.EqualTo("concat(\"f\", '\"', \"o'o\")"));
}
/**
* Tests that escapeQuotes returns concatenated strings when the given
* string contains a tick and and ends with a quote.
*/
[Test]
public void ShouldProvideConcatenatedStringsWhenStringEndsWithQuote()
{
string result = EscapeQuotes("Bar \"Rock'n'Roll\"");
Assert.That(result, Is.EqualTo("concat(\"Bar \", '\"', \"Rock'n'Roll\", '\"')"));
}
private string EscapeQuotes(string toEscape)
{
Type selectElementType = typeof(SelectElement);
MethodInfo escapeQuotesMethod = selectElementType.GetMethod("EscapeQuotes", BindingFlags.Static | BindingFlags.NonPublic);
string result = escapeQuotesMethod.Invoke(null, new object[] { toEscape }).ToString();
return result;
}
}