blob: 0e839966c579e839096bf3bec57cd542f0359345 [file] [log] [blame] [edit]
// <copyright file="ImplicitWaitTest.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;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace OpenQA.Selenium;
[TestFixture]
public class ImplicitWaitTest : DriverTestFixture
{
[TearDown]
public void ResetImplicitWaitTimeout()
{
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(0);
}
[Test]
public void ShouldImplicitlyWaitForASingleElement()
{
driver.Url = dynamicPage;
IWebElement add = driver.FindElement(By.Id("adder"));
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(3000);
add.Click();
driver.FindElement(By.Id("box0")); // All is well if this doesn't throw.
}
[Test]
public void ShouldStillFailToFindAnElementWhenImplicitWaitsAreEnabled()
{
driver.Url = dynamicPage;
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(500);
Assert.That(() => driver.FindElement(By.Id("box0")), Throws.InstanceOf<NoSuchElementException>());
}
[Test]
[NeedsFreshDriver]
public void ShouldReturnAfterFirstAttemptToFindOneAfterDisablingImplicitWaits()
{
driver.Url = dynamicPage;
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(3000);
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(0);
Assert.That(() => driver.FindElement(By.Id("box0")), Throws.InstanceOf<NoSuchElementException>());
}
[Test]
[NeedsFreshDriver]
public void ShouldImplicitlyWaitUntilAtLeastOneElementIsFoundWhenSearchingForMany()
{
driver.Url = dynamicPage;
IWebElement add = driver.FindElement(By.Id("adder"));
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(2000);
add.Click();
add.Click();
ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("redbox"));
Assert.That(elements, Has.Count.GreaterThanOrEqualTo(1));
}
[Test]
[NeedsFreshDriver]
public void ShouldStillFailToFindElementsWhenImplicitWaitsAreEnabled()
{
driver.Url = dynamicPage;
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(500);
ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("redbox"));
Assert.That(elements, Is.Empty);
}
[Test]
[NeedsFreshDriver]
public void ShouldReturnAfterFirstAttemptToFindManyAfterDisablingImplicitWaits()
{
driver.Url = dynamicPage;
IWebElement add = driver.FindElement(By.Id("adder"));
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(1100);
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(0);
add.Click();
ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("redbox"));
Assert.That(elements, Is.Empty);
}
[Test]
[IgnoreBrowser(Browser.IE, "Driver does not implement waiting for element visible for interaction")]
[IgnoreBrowser(Browser.Firefox, "Driver does not implement waiting for element visible for interaction")]
[IgnoreBrowser(Browser.Safari, "Driver does not implement waiting for element visible for interaction")]
public void ShouldImplicitlyWaitForAnElementToBeVisibleBeforeInteracting()
{
driver.Url = dynamicPage;
IWebElement reveal = driver.FindElement(By.Id("reveal"));
IWebElement revealed = driver.FindElement(By.Id("revealed"));
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(5000);
Assert.That(revealed.Displayed, Is.False, "revealed should not be visible");
reveal.Click();
try
{
revealed.SendKeys("hello world");
// This is what we want
}
catch (ElementNotInteractableException)
{
Assert.Fail("Element should have been visible");
}
}
[Test]
[IgnoreBrowser(Browser.IE, "Edge in IE Mode does not properly handle multiple windows")]
public void ShouldRetainImplicitlyWaitFromTheReturnedWebDriverOfWindowSwitchTo()
{
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1);
driver.Url = xhtmlTestPage;
driver.FindElement(By.Name("windowOne")).Click();
string originalHandle = driver.CurrentWindowHandle;
WaitFor(() => driver.WindowHandles.Count == 2, "Window handle count was not 2");
List<string> handles = new List<string>(driver.WindowHandles);
handles.Remove(originalHandle);
IWebDriver newWindow = driver.SwitchTo().Window(handles[0]);
DateTime start = DateTime.Now;
newWindow.FindElements(By.Id("this-crazy-thing-does-not-exist"));
DateTime end = DateTime.Now;
TimeSpan time = end - start;
driver.Close();
driver.SwitchTo().Window(originalHandle);
Assert.That(time.TotalMilliseconds, Is.GreaterThanOrEqualTo(1000));
}
}