| // <copyright file="ClickTest.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 ClickTest : DriverTestFixture |
| { |
| [SetUp] |
| public void SetupMethod() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("clicks.html"); |
| } |
| |
| [TearDown] |
| public void TearDownMethod() |
| { |
| driver.SwitchTo().DefaultContent(); |
| } |
| |
| [Test] |
| public void CanClickOnALinkAndFollowIt() |
| { |
| driver.FindElement(By.Id("normal")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void CanClickOnALinkThatOverflowsAndFollowIt() |
| { |
| driver.FindElement(By.Id("overflowLink")).Click(); |
| |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| } |
| |
| [Test] |
| public void CanClickOnAnAnchorAndNotReloadThePage() |
| { |
| ((IJavaScriptExecutor)driver).ExecuteScript("document.latch = true"); |
| |
| driver.FindElement(By.Id("anchor")).Click(); |
| |
| bool samePage = (bool)((IJavaScriptExecutor)driver).ExecuteScript("return document.latch"); |
| |
| Assert.That(samePage, Is.True, "Latch was reset"); |
| } |
| |
| [Test] |
| public void CanClickOnALinkThatUpdatesAnotherFrame() |
| { |
| driver.SwitchTo().Frame("source"); |
| |
| driver.FindElement(By.Id("otherframe")).Click(); |
| driver.SwitchTo().DefaultContent().SwitchTo().Frame("target"); |
| |
| Assert.That(driver.PageSource, Does.Contain("Hello WebDriver")); |
| } |
| |
| [Test] |
| public void ElementsFoundByJsCanLoadUpdatesInAnotherFrame() |
| { |
| driver.SwitchTo().Frame("source"); |
| |
| IWebElement toClick = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("return document.getElementById('otherframe');"); |
| toClick.Click(); |
| driver.SwitchTo().DefaultContent().SwitchTo().Frame("target"); |
| |
| Assert.That(driver.PageSource, Does.Contain("Hello WebDriver")); |
| } |
| |
| [Test] |
| public void JsLocatedElementsCanUpdateFramesIfFoundSomehowElse() |
| { |
| driver.SwitchTo().Frame("source"); |
| |
| // Prime the cache of elements |
| driver.FindElement(By.Id("otherframe")); |
| |
| // This _should_ return the same element |
| IWebElement toClick = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("return document.getElementById('otherframe');"); |
| toClick.Click(); |
| driver.SwitchTo().DefaultContent().SwitchTo().Frame("target"); |
| |
| Assert.That(driver.PageSource, Does.Contain("Hello WebDriver")); |
| } |
| |
| [Test] |
| |
| public void CanClickOnAnElementWithTopSetToANegativeNumber() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("styledPage.html"); |
| IWebElement searchBox = driver.FindElement(By.Name("searchBox")); |
| searchBox.SendKeys("Cheese"); |
| driver.FindElement(By.Name("btn")).Click(); |
| |
| string log = driver.FindElement(By.Id("log")).Text; |
| Assert.That(log, Is.EqualTo("click")); |
| } |
| |
| [Test] |
| public void ShouldSetRelatedTargetForMouseOver() |
| { |
| driver.Url = javascriptPage; |
| |
| driver.FindElement(By.Id("movable")).Click(); |
| |
| string log = driver.FindElement(By.Id("result")).Text; |
| |
| // Note: It is not guaranteed that the relatedTarget property of the mouseover |
| // event will be the parent, when using native events. Only check that the mouse |
| // has moved to this element, not that the parent element was the related target. |
| if (this.IsNativeEventsEnabled) |
| { |
| Assert.That(log, Does.StartWith("parent matches?")); |
| } |
| else |
| { |
| Assert.That(log, Is.EqualTo("parent matches? true")); |
| } |
| } |
| |
| [Test] |
| public void ShouldClickOnFirstBoundingClientRectWithNonZeroSize() |
| { |
| driver.FindElement(By.Id("twoClientRects")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| [IgnoreBrowser(Browser.IE, "Edge in IE Mode does not properly handle multiple windows")] |
| [NeedsFreshDriver(IsCreatedAfterTest = true)] |
| public void ShouldOnlyFollowHrefOnce() |
| { |
| driver.Url = clicksPage; |
| int windowHandlesBefore = driver.WindowHandles.Count; |
| |
| driver.FindElement(By.Id("new-window")).Click(); |
| WaitFor(() => { return driver.WindowHandles.Count >= windowHandlesBefore + 1; }, "Window handles was not " + (windowHandlesBefore + 1).ToString()); |
| Assert.That(driver.WindowHandles, Has.Exactly(windowHandlesBefore + 1).Items); |
| } |
| |
| [Test] |
| public void ClickingLabelShouldSetCheckbox() |
| { |
| driver.Url = formsPage; |
| |
| driver.FindElement(By.Id("label-for-checkbox-with-label")).Click(); |
| |
| Assert.That(driver.FindElement(By.Id("checkbox-with-label")).Selected, "Checkbox should be selected"); |
| } |
| |
| [Test] |
| public void CanClickOnALinkWithEnclosedImage() |
| { |
| driver.FindElement(By.Id("link-with-enclosed-image")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void CanClickOnAnImageEnclosedInALink() |
| { |
| driver.FindElement(By.Id("link-with-enclosed-image")).FindElement(By.TagName("img")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void CanClickOnALinkThatContainsTextWrappedInASpan() |
| { |
| driver.FindElement(By.Id("link-with-enclosed-span")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| [IgnoreBrowser(Browser.Firefox, "https://github.com/mozilla/geckodriver/issues/653")] |
| public void CanClickOnALinkThatContainsEmbeddedBlockElements() |
| { |
| driver.FindElement(By.Id("embeddedBlock")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void CanClickOnAnElementEnclosedInALink() |
| { |
| driver.FindElement(By.Id("link-with-enclosed-span")).FindElement(By.TagName("span")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnAnElementInTheViewport() |
| { |
| string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_out_of_bounds.html"); |
| |
| driver.Url = url; |
| IWebElement button = driver.FindElement(By.Id("button")); |
| button.Click(); |
| } |
| |
| [Test] |
| public void ClicksASurroundingStrongTag() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("ClickTest_testClicksASurroundingStrongTag.html"); |
| driver.FindElement(By.TagName("a")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| } |
| |
| [Test] |
| [IgnoreBrowser(Browser.Firefox, "https://bugzilla.mozilla.org/show_bug.cgi?id=1502636")] |
| public void CanClickAnImageMapArea() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/google_map.html"); |
| driver.FindElement(By.Id("rectG")).Click(); |
| WaitFor(() => { return driver.Title == "Target Page 1"; }, "Browser title was not 'Target Page 1'"); |
| |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/google_map.html"); |
| driver.FindElement(By.Id("circleO")).Click(); |
| WaitFor(() => { return driver.Title == "Target Page 2"; }, "Browser title was not 'Target Page 2'"); |
| |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/google_map.html"); |
| driver.FindElement(By.Id("polyLE")).Click(); |
| WaitFor(() => { return driver.Title == "Target Page 3"; }, "Browser title was not 'Target Page 3'"); |
| } |
| |
| [Test] |
| [IgnoreBrowser(Browser.Firefox, "https://bugzilla.mozilla.org/show_bug.cgi?id=1422272")] |
| public void ShouldBeAbleToClickOnAnElementGreaterThanTwoViewports() |
| { |
| string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_too_big.html"); |
| driver.Url = url; |
| |
| IWebElement element = driver.FindElement(By.Id("click")); |
| |
| element.Click(); |
| |
| WaitFor(() => { return driver.Title == "clicks"; }, "Browser title was not 'clicks'"); |
| } |
| |
| [Test] |
| [IgnoreBrowser(Browser.Firefox, "https://bugzilla.mozilla.org/show_bug.cgi?id=1937115")] |
| public void ShouldBeAbleToClickOnAnElementInFrameGreaterThanTwoViewports() |
| { |
| string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_too_big_in_frame.html"); |
| driver.Url = url; |
| |
| IWebElement frame = driver.FindElement(By.Id("iframe1")); |
| driver.SwitchTo().Frame(frame); |
| |
| IWebElement element = driver.FindElement(By.Id("click")); |
| |
| element.Click(); |
| |
| WaitFor(() => { return driver.Title == "clicks"; }, "Browser title was not 'clicks'"); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnRightToLeftLanguageLink() |
| { |
| String url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_rtl.html"); |
| driver.Url = url; |
| |
| IWebElement element = driver.FindElement(By.Id("ar_link")); |
| element.Click(); |
| |
| WaitFor(() => driver.Title == "clicks", "Expected title to be 'clicks'"); |
| Assert.That(driver.Title, Is.EqualTo("clicks")); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnLinkInAbsolutelyPositionedFooter() |
| { |
| string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("fixedFooterNoScroll.html"); |
| driver.Url = url; |
| |
| driver.FindElement(By.Id("link")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnLinkInAbsolutelyPositionedFooterInQuirksMode() |
| { |
| string url = EnvironmentManager.Instance.UrlBuilder.WhereIs("fixedFooterNoScrollQuirksMode.html"); |
| driver.Url = url; |
| |
| driver.FindElement(By.Id("link")).Click(); |
| WaitFor(() => { return driver.Title == "XHTML Test Page"; }, "Browser title was not 'XHTML Test Page'"); |
| Assert.That(driver.Title, Is.EqualTo("XHTML Test Page")); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnLinksWithNoHrefAttribute() |
| { |
| driver.Url = javascriptPage; |
| |
| IWebElement element = driver.FindElement(By.LinkText("No href")); |
| element.Click(); |
| |
| WaitFor(() => driver.Title == "Changed", "Expected title to be 'Changed'"); |
| Assert.That(driver.Title, Is.EqualTo("Changed")); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnALinkThatWrapsToTheNextLine() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/link_that_wraps.html"); |
| |
| driver.FindElement(By.Id("link")).Click(); |
| |
| WaitFor(() => driver.Title == "Submitted Successfully!", "Expected title to be 'Submitted Successfully!'"); |
| Assert.That(driver.Title, Is.EqualTo("Submitted Successfully!")); |
| } |
| |
| [Test] |
| public void ShouldBeAbleToClickOnASpanThatWrapsToTheNextLine() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/span_that_wraps.html"); |
| |
| driver.FindElement(By.Id("span")).Click(); |
| |
| WaitFor(() => driver.Title == "Submitted Successfully!", "Expected title to be 'Submitted Successfully!'"); |
| Assert.That(driver.Title, Is.EqualTo("Submitted Successfully!")); |
| } |
| |
| [Test] |
| public void ClickingOnADisabledElementIsANoOp() |
| { |
| driver.Url = EnvironmentManager.Instance.UrlBuilder.WhereIs("click_tests/disabled_element.html"); |
| |
| IWebElement element = driver.FindElement(By.Name("disabled")); |
| element.Click(); |
| } |
| |
| //------------------------------------------------------------------ |
| // Tests below here are not included in the Java test suite |
| //------------------------------------------------------------------ |
| [Test] |
| public void ShouldBeAbleToClickLinkContainingLineBreak() |
| { |
| driver.Url = simpleTestPage; |
| driver.FindElement(By.Id("multilinelink")).Click(); |
| WaitFor(() => { return driver.Title == "We Arrive Here"; }, "Browser title was not 'We Arrive Here'"); |
| Assert.That(driver.Title, Is.EqualTo("We Arrive Here")); |
| } |
| } |