Path: blob/trunk/dotnet/test/common/PageLoadingTest.cs
2868 views
// <copyright file="PageLoadingTest.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 OpenQA.Selenium.Environment; using System; namespace OpenQA.Selenium; [TestFixture] public class PageLoadingTest : DriverTestFixture { private IWebDriver localDriver; [SetUp] public void RestartOriginalDriver() { driver = EnvironmentManager.Instance.GetCurrentDriver(); } [TearDown] public void QuitAdditionalDriver() { if (localDriver != null) { localDriver.Quit(); localDriver = null; } } [Test] public void NoneStrategyShouldNotWaitForPageToLoad() { InitLocalDriver(PageLoadStrategy.None); string slowPage = EnvironmentManager.Instance.UrlBuilder.WhereIs("sleep?time=5"); DateTime start = DateTime.Now; localDriver.Url = slowPage; DateTime end = DateTime.Now; TimeSpan duration = end - start; // The slow loading resource on that page takes 6 seconds to return, // but with 'none' page loading strategy 'get' operation should not wait. Assert.That(duration.TotalMilliseconds, Is.LessThan(1000), "Took too long to load page: " + duration.TotalMilliseconds); } [Test] public void NoneStrategyShouldNotWaitForPageToRefresh() { InitLocalDriver(PageLoadStrategy.None); string slowPage = EnvironmentManager.Instance.UrlBuilder.WhereIs("sleep?time=5"); // We discard the element, but want a check to make sure the page is loaded WaitFor(() => localDriver.FindElement(By.TagName("body")), TimeSpan.FromSeconds(10), "did not find body"); DateTime start = DateTime.Now; localDriver.Navigate().Refresh(); DateTime end = DateTime.Now; TimeSpan duration = end - start; // The slow loading resource on that page takes 6 seconds to return, // but with 'none' page loading strategy 'refresh' operation should not wait. Assert.That(duration.TotalMilliseconds, Is.LessThan(1000), "Took too long to load page: " + duration.TotalMilliseconds); } [Test] public void EagerStrategyShouldNotWaitForResources() { InitLocalDriver(PageLoadStrategy.Eager); string slowPage = EnvironmentManager.Instance.UrlBuilder.WhereIs("slowLoadingResourcePage.html"); DateTime start = DateTime.Now; localDriver.Url = slowPage; // We discard the element, but want a check to make sure the GET actually // completed. WaitFor(() => localDriver.FindElement(By.Id("peas")), TimeSpan.FromSeconds(10), "did not find element"); DateTime end = DateTime.Now; // The slow loading resource on that page takes 6 seconds to return. If we // waited for it, our load time should be over 6 seconds. TimeSpan duration = end - start; Assert.That(duration.TotalMilliseconds, Is.LessThan(5 * 1000), "Took too long to load page: " + duration.TotalMilliseconds); } [Test] public void EagerStrategyShouldNotWaitForResourcesOnRefresh() { InitLocalDriver(PageLoadStrategy.Eager); string slowPage = EnvironmentManager.Instance.UrlBuilder.WhereIs("slowLoadingResourcePage.html"); localDriver.Url = slowPage; // We discard the element, but want a check to make sure the GET actually // completed. WaitFor(() => localDriver.FindElement(By.Id("peas")), TimeSpan.FromSeconds(10), "did not find element"); DateTime start = DateTime.Now; localDriver.Navigate().Refresh(); // We discard the element, but want a check to make sure the GET actually // completed. WaitFor(() => localDriver.FindElement(By.Id("peas")), TimeSpan.FromSeconds(10), "did not find element"); DateTime end = DateTime.Now; // The slow loading resource on that page takes 6 seconds to return. If we // waited for it, our load time should be over 6 seconds. TimeSpan duration = end - start; Assert.That(duration.TotalMilliseconds, Is.LessThan(5 * 1000), "Took too long to load page: " + duration.TotalMilliseconds); } [Test] public void EagerStrategyShouldWaitForDocumentToBeLoaded() { InitLocalDriver(PageLoadStrategy.Eager); string slowPage = EnvironmentManager.Instance.UrlBuilder.WhereIs("sleep?time=3"); localDriver.Url = slowPage; // We discard the element, but want a check to make sure the GET actually completed. WaitFor(() => localDriver.FindElement(By.TagName("body")), TimeSpan.FromSeconds(10), "did not find body"); } [Test] public void NormalStrategyShouldWaitForDocumentToBeLoaded() { driver.Url = simpleTestPage; Assert.That(driver.Title, Is.EqualTo("Hello WebDriver")); } [Test] [IgnoreBrowser(Browser.All, "Server not properly redirecting")] public void ShouldFollowRedirectsSentInTheHttpResponseHeaders() { driver.Url = redirectPage; Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] public void ShouldFollowMetaRedirects() { driver.Url = metaRedirectPage; WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] [IgnoreBrowser(Browser.Firefox, "Browser doesn't see subsequent navigation to a fragment as a new navigation.")] public void ShouldBeAbleToGetAFragmentOnTheCurrentPage() { driver.Url = xhtmlTestPage; driver.Url = xhtmlTestPage + "#text"; driver.FindElement(By.Id("id1")); } [Test] [NeedsFreshDriver(IsCreatedBeforeTest = true)] public void ShouldThrowIfUrlIsMalformed() { Assert.That(() => driver.Url = "www.test.com", Throws.InstanceOf<WebDriverException>()); } [Test] [NeedsFreshDriver(IsCreatedBeforeTest = true)] public void ShouldThrowIfUrlIsMalformedInPortPart() { Assert.That(() => driver.Url = "http://localhost:30001bla", Throws.InstanceOf<WebDriverException>()); } [Test] public void ShouldReturnUrlOnNotExistedPage() { string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("not_existed_page.html"); driver.Url = url; Assert.That(driver.Url, Is.EqualTo(url)); } [Test] public void ShouldBeAbleToLoadAPageWithFramesetsAndWaitUntilAllFramesAreLoaded() { driver.Url = framesetPage; driver.SwitchTo().Frame(0); IWebElement pageNumber = driver.FindElement(By.XPath("//span[@id='pageNumber']")); Assert.That(pageNumber.Text.Trim(), Is.EqualTo("1")); driver.SwitchTo().DefaultContent().SwitchTo().Frame(1); pageNumber = driver.FindElement(By.XPath("//span[@id='pageNumber']")); Assert.That(pageNumber.Text.Trim(), Is.EqualTo("2")); } [Test] [NeedsFreshDriver(IsCreatedBeforeTest = true)] public void ShouldDoNothingIfThereIsNothingToGoBackTo() { string originalTitle = driver.Title; driver.Url = formsPage; driver.Navigate().Back(); // We may have returned to the browser's home page string currentTitle = driver.Title; Assert.That(currentTitle, Is.EqualTo(originalTitle).Or.EqualTo("We Leave From Here")); if (driver.Title == originalTitle) { driver.Navigate().Back(); Assert.That(driver.Title, Is.EqualTo(originalTitle)); } } [Test] public void ShouldBeAbleToNavigateBackInTheBrowserHistory() { driver.Url = formsPage; driver.FindElement(By.Id("imageButton")).Submit(); WaitFor(TitleToBeEqualTo("We Arrive Here"), "Browser title was not 'We Arrive Here'"); Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Navigate().Back(); WaitFor(TitleToBeEqualTo("We Leave From Here"), "Browser title was not 'We Leave From Here'"); Assert.That(driver.Title, Is.EqualTo("We Leave From Here")); } [Test] public void ShouldBeAbleToNavigateBackInTheBrowserHistoryInPresenceOfIframes() { driver.Url = xhtmlTestPage; driver.FindElement(By.Name("sameWindow")).Click(); WaitFor(TitleToBeEqualTo("This page has iframes"), "Browser title was not 'This page has iframes'"); Assert.That(driver.Title, Is.EqualTo("This page has iframes")); driver.Navigate().Back(); WaitFor(TitleToBeEqualTo("XHTML Test Page"), "Browser title was not 'XHTML Test Page'"); Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } [Test] public void ShouldBeAbleToNavigateForwardsInTheBrowserHistory() { driver.Url = formsPage; driver.FindElement(By.Id("imageButton")).Submit(); WaitFor(TitleToBeEqualTo("We Arrive Here"), "Browser title was not 'We Arrive Here'"); Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); driver.Navigate().Back(); WaitFor(TitleToBeEqualTo("We Leave From Here"), "Browser title was not 'We Leave From Here'"); Assert.That(driver.Title, Is.EqualTo("We Leave From Here")); driver.Navigate().Forward(); WaitFor(TitleToBeEqualTo("We Arrive Here"), "Browser title was not 'We Arrive Here'"); Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); } [Test] [Ignore("Unable to open secure url")] [IgnoreBrowser(Browser.IE, "Browser does not support using insecure SSL certs")] [IgnoreBrowser(Browser.Safari, "Browser does not support using insecure SSL certs")] public void ShouldBeAbleToAccessPagesWithAnInsecureSslCertificate() { String url = EnvironmentManager.Instance.UrlBuilder.WhereIsSecure("simpleTest.html"); driver.Url = url; // This should work Assert.That(driver.Title, Is.EqualTo("Hello WebDriver")); } [Test] public void ShouldBeAbleToRefreshAPage() { driver.Url = xhtmlTestPage; driver.Navigate().Refresh(); Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); } /// <summary> /// see <a href="http://code.google.com/p/selenium/issues/detail?id=208">Issue 208</a> /// </summary> [Test] [IgnoreBrowser(Browser.IE, "Browser does, in fact, hang in this case.")] [IgnoreBrowser(Browser.Firefox, "Browser does, in fact, hang in this case.")] public void ShouldNotHangIfDocumentOpenCallIsNeverFollowedByDocumentCloseCall() { driver.Url = documentWrite; // If this command succeeds, then all is well. driver.FindElement(By.XPath("//body")); } [Test] [NeedsFreshDriver(IsCreatedAfterTest = true)] public void PageLoadTimeoutCanBeChanged() { TestPageLoadTimeoutIsEnforced(2); TestPageLoadTimeoutIsEnforced(3); } [Test] [NeedsFreshDriver(IsCreatedAfterTest = true)] public void CanHandleSequentialPageLoadTimeouts() { long pageLoadTimeout = 2; long pageLoadTimeBuffer = 10; string slowLoadingPageUrl = EnvironmentManager.Instance.UrlBuilder.WhereIs("sleep?time=" + (pageLoadTimeout + pageLoadTimeBuffer)); driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(2); AssertPageLoadTimeoutIsEnforced(() => driver.Url = slowLoadingPageUrl, pageLoadTimeout, pageLoadTimeBuffer); AssertPageLoadTimeoutIsEnforced(() => driver.Url = slowLoadingPageUrl, pageLoadTimeout, pageLoadTimeBuffer); } [Test] [NeedsFreshDriver(IsCreatedAfterTest = true)] public void ShouldTimeoutIfAPageTakesTooLongToLoad() { try { TestPageLoadTimeoutIsEnforced(2); } finally { driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); } // Load another page after get() timed out but before test HTTP server served previous page. driver.Url = xhtmlTestPage; WaitFor(TitleToBeEqualTo("XHTML Test Page"), "Title was not expected value"); } [Test] [NeedsFreshDriver(IsCreatedAfterTest = true)] public void ShouldTimeoutIfAPageTakesTooLongToLoadAfterClick() { driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(2); driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("page_with_link_to_slow_loading_page.html"); IWebElement link = WaitFor(() => driver.FindElement(By.Id("link-to-slow-loading-page")), "Could not find link"); try { AssertPageLoadTimeoutIsEnforced(() => link.Click(), 2, 3); } finally { driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); } // Load another page after get() timed out but before test HTTP server served previous page. driver.Url = xhtmlTestPage; WaitFor(TitleToBeEqualTo("XHTML Test Page"), "Title was not expected value"); } [Test] [NeedsFreshDriver(IsCreatedAfterTest = true)] public void ShouldTimeoutIfAPageTakesTooLongToRefresh() { // Get the sleeping servlet with a pause of 5 seconds long pageLoadTimeout = 2; long pageLoadTimeBuffer = 0; string slowLoadingPageUrl = EnvironmentManager.Instance.UrlBuilder.WhereIs("sleep?time=" + (pageLoadTimeout + pageLoadTimeBuffer)); driver.Url = slowLoadingPageUrl; driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(2); try { AssertPageLoadTimeoutIsEnforced(() => driver.Navigate().Refresh(), 2, 4); } finally { driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); } // Load another page after get() timed out but before test HTTP server served previous page. driver.Url = xhtmlTestPage; WaitFor(TitleToBeEqualTo("XHTML Test Page"), "Title was not expected value"); } [Test] [IgnoreBrowser(Browser.Chrome, "Chrome driver does, in fact, stop loading page after a timeout.")] [IgnoreBrowser(Browser.Edge, "Edge driver does, in fact, stop loading page after a timeout.")] [NeedsFreshDriver(IsCreatedAfterTest = true)] public void ShouldNotStopLoadingPageAfterTimeout() { try { TestPageLoadTimeoutIsEnforced(1); } finally { driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); } WaitFor(() => { try { string text = driver.FindElement(By.TagName("body")).Text; return text.Contains("Slept for 11s"); } catch (NoSuchElementException) { } catch (StaleElementReferenceException) { } return false; }, TimeSpan.FromSeconds(30), "Did not find expected text"); } private Func<bool> TitleToBeEqualTo(string expectedTitle) { return () => { return driver.Title == expectedTitle; }; } /** * Sets given pageLoadTimeout to the {@link #driver} and asserts that attempt to navigate to a * page that takes much longer (10 seconds longer) to load results in a TimeoutException. * <p> * Side effects: 1) {@link #driver} is configured to use given pageLoadTimeout, * 2) test HTTP server still didn't serve the page to browser (some browsers may still * be waiting for the page to load despite the fact that driver responded with the timeout). * </p> */ private void TestPageLoadTimeoutIsEnforced(long webDriverPageLoadTimeoutInSeconds) { // Test page will load this many seconds longer than WD pageLoadTimeout. long pageLoadTimeBufferInSeconds = 10; string slowLoadingPageUrl = EnvironmentManager.Instance.UrlBuilder.WhereIs("sleep?time=" + (webDriverPageLoadTimeoutInSeconds + pageLoadTimeBufferInSeconds)); driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(webDriverPageLoadTimeoutInSeconds); AssertPageLoadTimeoutIsEnforced(() => driver.Url = slowLoadingPageUrl, webDriverPageLoadTimeoutInSeconds, pageLoadTimeBufferInSeconds); } private void AssertPageLoadTimeoutIsEnforced(TestDelegate delegateToTest, long webDriverPageLoadTimeoutInSeconds, long pageLoadTimeBufferInSeconds) { DateTime start = DateTime.Now; Assert.That(delegateToTest, Throws.InstanceOf<WebDriverTimeoutException>(), "I should have timed out after " + webDriverPageLoadTimeoutInSeconds + " seconds"); DateTime end = DateTime.Now; TimeSpan duration = end - start; Assert.That(duration.TotalSeconds, Is.GreaterThan(webDriverPageLoadTimeoutInSeconds)); Assert.That(duration.TotalSeconds, Is.LessThan(webDriverPageLoadTimeoutInSeconds + pageLoadTimeBufferInSeconds)); } private void InitLocalDriver(PageLoadStrategy strategy) { EnvironmentManager.Instance.CloseCurrentDriver(); if (localDriver != null) { localDriver.Quit(); } PageLoadStrategyOptions options = new PageLoadStrategyOptions(); options.PageLoadStrategy = strategy; localDriver = EnvironmentManager.Instance.CreateDriverInstance(options); } private class PageLoadStrategyOptions : DriverOptions { public override void AddAdditionalOption(string capabilityName, object capabilityValue) { } public override ICapabilities ToCapabilities() { return null; } } }