| // 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. |
| |
| package org.openqa.selenium; |
| |
| import static org.assertj.core.api.Assertions.assertThat; |
| import static org.openqa.selenium.WaitingConditions.newWindowIsOpened; |
| import static org.openqa.selenium.WaitingConditions.pageSourceToContain; |
| import static org.openqa.selenium.support.ui.ExpectedConditions.titleIs; |
| import static org.openqa.selenium.testing.drivers.Browser.FIREFOX; |
| import static org.openqa.selenium.testing.drivers.Browser.IE; |
| import static org.openqa.selenium.testing.drivers.Browser.SAFARI; |
| |
| import java.util.Set; |
| import org.junit.jupiter.api.BeforeEach; |
| import org.junit.jupiter.api.Test; |
| import org.openqa.selenium.testing.Ignore; |
| import org.openqa.selenium.testing.JupiterTestBase; |
| import org.openqa.selenium.testing.NoDriverAfterTest; |
| import org.openqa.selenium.testing.NotYetImplemented; |
| import org.openqa.selenium.testing.SwitchToTopAfterTest; |
| |
| class ClickTest extends JupiterTestBase { |
| |
| @BeforeEach |
| public void setUp() { |
| driver.get(pages.clicksPage); |
| } |
| |
| @Test |
| void testCanClickOnALinkAndFollowIt() { |
| driver.findElement(By.id("normal")).click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testCanClickOnALinkThatOverflowsAndFollowIt() { |
| driver.findElement(By.id("overflowLink")).click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testCanClickOnAnAnchorAndNotReloadThePage() { |
| ((JavascriptExecutor) driver).executeScript("document.latch = true"); |
| |
| driver.findElement(By.id("anchor")).click(); |
| |
| Boolean samePage = |
| (Boolean) ((JavascriptExecutor) driver).executeScript("return document.latch"); |
| |
| assertThat(samePage).as("Latch was reset").isTrue(); |
| } |
| |
| @SwitchToTopAfterTest |
| @Test |
| void testCanClickOnALinkThatUpdatesAnotherFrame() { |
| driver.switchTo().frame("source"); |
| |
| driver.findElement(By.id("otherframe")).click(); |
| driver.switchTo().defaultContent().switchTo().frame("target"); |
| |
| wait.until(pageSourceToContain("Hello WebDriver")); |
| } |
| |
| @SwitchToTopAfterTest |
| @Test |
| void testElementsFoundByJsCanLoadUpdatesInAnotherFrame() { |
| driver.switchTo().frame("source"); |
| |
| WebElement toClick = |
| (WebElement) |
| ((JavascriptExecutor) driver) |
| .executeScript("return document.getElementById('otherframe');"); |
| toClick.click(); |
| driver.switchTo().defaultContent().switchTo().frame("target"); |
| |
| wait.until(pageSourceToContain("Hello WebDriver")); |
| } |
| |
| @SwitchToTopAfterTest |
| @Test |
| void testJsLocatedElementsCanUpdateFramesIfFoundSomehowElse() { |
| driver.switchTo().frame("source"); |
| |
| // Prime the cache of elements |
| driver.findElement(By.id("otherframe")); |
| |
| // This _should_ return the same element |
| WebElement toClick = |
| (WebElement) |
| ((JavascriptExecutor) driver) |
| .executeScript("return document.getElementById('otherframe');"); |
| toClick.click(); |
| driver.switchTo().defaultContent().switchTo().frame("target"); |
| |
| wait.until(pageSourceToContain("Hello WebDriver")); |
| } |
| |
| @Test |
| void testCanClickOnAnElementWithTopSetToANegativeNumber() { |
| String page = appServer.whereIs("styledPage.html"); |
| driver.get(page); |
| WebElement searchBox = driver.findElement(By.name("searchBox")); |
| searchBox.sendKeys("Cheese"); |
| driver.findElement(By.name("btn")).click(); |
| |
| String log = driver.findElement(By.id("log")).getText(); |
| assertThat(log).isEqualTo("click"); |
| } |
| |
| @Test |
| @NotYetImplemented(SAFARI) |
| public void testShouldSetRelatedTargetForMouseOver() { |
| driver.get(pages.javascriptPage); |
| |
| driver.findElement(By.id("movable")).click(); |
| |
| String log = driver.findElement(By.id("result")).getText(); |
| |
| assertThat(log).isEqualTo("parent matches? true"); |
| } |
| |
| @Test |
| @NotYetImplemented(SAFARI) |
| public void testShouldClickOnFirstBoundingClientRectWithNonZeroSize() { |
| driver.findElement(By.id("twoClientRects")).click(); |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @NoDriverAfterTest(failedOnly = true) |
| @Test |
| void testShouldOnlyFollowHrefOnce() { |
| driver.get(pages.clicksPage); |
| String current = driver.getWindowHandle(); |
| Set<String> currentWindowHandles = driver.getWindowHandles(); |
| |
| try { |
| driver.findElement(By.id("new-window")).click(); |
| String newWindowHandle = wait.until(newWindowIsOpened(currentWindowHandles)); |
| driver.switchTo().window(newWindowHandle); |
| driver.close(); |
| } finally { |
| driver.switchTo().window(current); |
| } |
| } |
| |
| @Test |
| @NotYetImplemented(SAFARI) |
| public void testClickingLabelShouldSetCheckbox() { |
| driver.get(pages.formPage); |
| |
| driver.findElement(By.id("label-for-checkbox-with-label")).click(); |
| |
| assertThat(driver.findElement(By.id("checkbox-with-label")).isSelected()).isTrue(); |
| } |
| |
| @Test |
| @NotYetImplemented(SAFARI) |
| public void testCanClickOnALinkWithEnclosedImage() { |
| driver.findElement(By.id("link-with-enclosed-image")).click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testCanClickOnAnImageEnclosedInALink() { |
| driver.findElement(By.id("link-with-enclosed-image")).findElement(By.tagName("img")).click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| @NotYetImplemented(SAFARI) |
| public void testCanClickOnALinkThatContainsTextWrappedInASpan() { |
| driver.findElement(By.id("link-with-enclosed-span")).click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| @Ignore( |
| value = FIREFOX, |
| reason = "block can't be scrolled into view", |
| issue = "https://github.com/mozilla/geckodriver/issues/653") |
| @NotYetImplemented(SAFARI) |
| public void testCanClickOnALinkThatContainsEmbeddedBlockElements() { |
| driver.findElement(By.id("embeddedBlock")).click(); |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testCanClickOnAnElementEnclosedInALink() { |
| driver.findElement(By.id("link-with-enclosed-span")).findElement(By.tagName("span")).click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnAnElementInTheViewport() { |
| String url = appServer.whereIs("click_out_of_bounds.html"); |
| |
| driver.get(url); |
| WebElement button = driver.findElement(By.id("button")); |
| button.click(); |
| } |
| |
| @Test |
| @NotYetImplemented(SAFARI) |
| public void testClicksASurroundingStrongTag() { |
| driver.get(appServer.whereIs("ClickTest_testClicksASurroundingStrongTag.html")); |
| driver.findElement(By.tagName("a")).click(); |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| @Ignore(IE) |
| @Ignore( |
| value = FIREFOX, |
| reason = "imagemap can't be scrolled into view", |
| issue = "https://bugzilla.mozilla.org/show_bug.cgi?id=1502636") |
| @NotYetImplemented(SAFARI) |
| public void testCanClickAnImageMapArea() { |
| driver.get(appServer.whereIs("click_tests/google_map.html")); |
| driver.findElement(By.id("rectG")).click(); |
| wait.until(titleIs("Target Page 1")); |
| |
| driver.get(appServer.whereIs("click_tests/google_map.html")); |
| driver.findElement(By.id("circleO")).click(); |
| wait.until(titleIs("Target Page 2")); |
| |
| driver.get(appServer.whereIs("click_tests/google_map.html")); |
| driver.findElement(By.id("polyLE")).click(); |
| wait.until(titleIs("Target Page 3")); |
| } |
| |
| @Test |
| @Ignore( |
| value = FIREFOX, |
| reason = "Large element can't be scrolled into view", |
| issue = "https://bugzilla.mozilla.org/show_bug.cgi?id=1422272") |
| @NotYetImplemented(SAFARI) |
| public void testShouldBeAbleToClickOnAnElementGreaterThanTwoViewports() { |
| String url = appServer.whereIs("click_too_big.html"); |
| driver.get(url); |
| |
| WebElement element = driver.findElement(By.id("click")); |
| |
| element.click(); |
| |
| wait.until(titleIs("clicks")); |
| } |
| |
| @SwitchToTopAfterTest |
| @Test |
| @NotYetImplemented(SAFARI) |
| @Ignore( |
| value = FIREFOX, |
| reason = |
| "Clicking on element doesn't work if element is in iframe outside of viewport in Beta", |
| issue = "https://bugzilla.mozilla.org/show_bug.cgi?id=1937115") |
| public void testShouldBeAbleToClickOnAnElementInFrameGreaterThanTwoViewports() { |
| String url = appServer.whereIs("click_too_big_in_frame.html"); |
| driver.get(url); |
| |
| WebElement frame = driver.findElement(By.id("iframe1")); |
| driver.switchTo().frame(frame); |
| |
| WebElement element = driver.findElement(By.id("click")); |
| element.click(); |
| |
| wait.until(titleIs("clicks")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnRTLLanguageLink() { |
| String url = appServer.whereIs("click_rtl.html"); |
| driver.get(url); |
| |
| WebElement element = driver.findElement(By.id("ar_link")); |
| element.click(); |
| |
| wait.until(titleIs("clicks")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnLinkInAbsolutelyPositionedFooter() { |
| String url = appServer.whereIs("fixedFooterNoScroll.html"); |
| driver.get(url); |
| |
| WebElement element = driver.findElement(By.id("link")); |
| element.click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnLinkInAbsolutelyPositionedFooterInQuirksMode() { |
| String url = appServer.whereIs("fixedFooterNoScrollQuirksMode.html"); |
| driver.get(url); |
| |
| WebElement element = driver.findElement(By.id("link")); |
| element.click(); |
| |
| wait.until(titleIs("XHTML Test Page")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnLinksWithNoHrefAttribute() { |
| driver.get(pages.javascriptPage); |
| |
| WebElement element = driver.findElement(By.linkText("No href")); |
| element.click(); |
| |
| wait.until(titleIs("Changed")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnALinkThatWrapsToTheNextLine() { |
| driver.get(appServer.whereIs("click_tests/link_that_wraps.html")); |
| |
| driver.findElement(By.id("link")).click(); |
| |
| wait.until(titleIs("Submitted Successfully!")); |
| } |
| |
| @Test |
| void testShouldBeAbleToClickOnASpanThatWrapsToTheNextLine() { |
| driver.get(appServer.whereIs("click_tests/span_that_wraps.html")); |
| |
| driver.findElement(By.id("span")).click(); |
| |
| wait.until(titleIs("Submitted Successfully!")); |
| } |
| |
| @Test |
| void clickingOnADisabledElementIsANoOp() { |
| driver.get(appServer.whereIs("click_tests/disabled_element.html")); |
| |
| driver.findElement(By.name("disabled")).click(); // Should not throw |
| } |
| } |