diff options
author | KatriHaapalinna <haapalinnakatri@gmail.com> | 2019-04-08 14:31:17 +0300 |
---|---|---|
committer | Sun Zhe <31067185+ZheSun88@users.noreply.github.com> | 2019-04-08 14:31:17 +0300 |
commit | 262863dbf6b33995d47bd9433e8f087d13a468ee (patch) | |
tree | fdb9d8fd7930d8b201e983b2cfe3541e74d66454 /uitest | |
parent | 7a010de76ec67362d5c9d395c79ce3e22613469f (diff) | |
download | vaadin-framework-262863dbf6b33995d47bd9433e8f087d13a468ee.tar.gz vaadin-framework-262863dbf6b33995d47bd9433e8f087d13a468ee.zip |
Use Enter and Space keys to fire Window header buttons (#11517) (#11534)
* Fixes 11517. Use ENTER and SPACE keys as shortcuts for header buttons
* Merge branch 'master' into fix-11517
* Increase sleep time for test failing in validation
* Merge branch 'master' into fix-11517
Diffstat (limited to 'uitest')
2 files changed, 442 insertions, 0 deletions
diff --git a/uitest/src/main/java/com/vaadin/tests/components/window/WindowHeaderButtonKeyboardActions.java b/uitest/src/main/java/com/vaadin/tests/components/window/WindowHeaderButtonKeyboardActions.java new file mode 100644 index 0000000000..4b5dc6de48 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/window/WindowHeaderButtonKeyboardActions.java @@ -0,0 +1,37 @@ +package com.vaadin.tests.components.window; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.Window; + +@Widgetset("com.vaadin.DefaultWidgetSet") +public class WindowHeaderButtonKeyboardActions extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + Button button = new Button("Open window"); + button.setId("firstButton"); + + button.addClickListener(new Button.ClickListener() { + public void buttonClick(Button.ClickEvent event) { + Window window = new Window("WINDOW"); + window.setContent(new Label("Inside window")); + window.setHeight("100px"); + window.setId("testWindow"); + window.addCloseListener(new Window.CloseListener() { + @Override + public void windowClose(Window.CloseEvent e) { + + } + }); + addWindow(window); + } + }); + addComponent(button); + + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/window/WindowHeaderButtonKeyboardActionsTest.java b/uitest/src/test/java/com/vaadin/tests/components/window/WindowHeaderButtonKeyboardActionsTest.java new file mode 100644 index 0000000000..47ac64107d --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/window/WindowHeaderButtonKeyboardActionsTest.java @@ -0,0 +1,405 @@ +package com.vaadin.tests.components.window; + +import static org.junit.Assert.assertTrue; + +import java.io.IOException; + +import org.junit.Test; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; + +import com.vaadin.testbench.By; +import com.vaadin.testbench.elements.WindowElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class WindowHeaderButtonKeyboardActionsTest extends MultiBrowserTest { + + private static final String HEADER_CLASS = "v-window-header"; + private static final String RESTORE_BOX_CLASS = "v-window-restorebox"; + private static final String MAXIMIZE_BOX_CLASS = "v-window-maximizebox"; + private static final String CLOSE_BOX_CLASS = "v-window-closebox"; + + @Override + public void setup() throws Exception { + super.setup(); + openTestURL(); + + // open window before each test case + waitForElementPresent(By.id("firstButton")); + WebElement button = findElement(By.id("firstButton")); + button.click(); + + waitForElementPresent(By.id("testWindow")); + } + + /** + * Scenario: focus the close button of the opened window -> press ENTER key + * -> window should be closed + */ + @Test + public void testCloseWindowWithEnter() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(CLOSE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + + assertTrue("Window's close button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.ENTER); + assertTrue("Window is not closed", + findElements(By.className("v-window")).size() == 0); + } + + /** + * Scenario: focus the close button of the opened window -> press SPACE key + * -> window should be closed + */ + @Test + public void testCloseWindowWithSpace() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(CLOSE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + + assertTrue("Window's close button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.SPACE); + + assertTrue("Window is not closed", + findElements(By.className("v-window")).size() == 0); + } + + /** + * Scenario: focus close button of opened window -> press keys DELETE, + * ARROW_LEFT, and END -> window should remain open after all actions + */ + @Test + public void testIncorrectKeyInputDoesntFireClose() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(CLOSE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + + assertTrue("Window's close button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.DELETE); + assertTrue( + "Window is closed by DELETE when close button is the focused element", + findElements(By.className("v-window")).size() > 0); + + pressKeyAndWait(Keys.ARROW_LEFT); + assertTrue( + "Window is closed by ARROW_LEFT when close button is the focused element", + findElements(By.className("v-window")).size() > 0); + + pressKeyAndWait(Keys.END); + assertTrue( + "Window is closed by END when close button is the focused element", + findElements(By.className("v-window")).size() > 0); + } + + /** + * Scenario: close button of opened window is not focused -> press keys + * ENTER and SPACE -> window should remain open after all actions + */ + @Test + public void testNonfocusedKeyDoesntCloseWindow() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(CLOSE_BOX_CLASS)); + assertTrue("Window's close button is the focused element", + !closeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.ENTER); + assertTrue( + "Window is closed by ENTER when close button is not the focused element", + findElements(By.className("v-window")).size() > 0); + + pressKeyAndWait(Keys.SPACE); + assertTrue( + "Window is closed by SPACE when close button is not the focused element", + findElements(By.className("v-window")).size() > 0); + } + + /** + * Scenario: focus close button of opened window -> press keys TAB, and + * TAB+SHIFT in succession, shifting focus from and back to the button -> + * press ENTER key -> window should be closed + */ + @Test + public void testShiftFocusAndCloseWindow() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(CLOSE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + assertTrue("Window's close button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.TAB); + assertTrue("Window's close button is the focused element", + !closeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.SHIFT, Keys.TAB); + assertTrue("Window's close button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.ENTER); + assertTrue( + "Window is not closed when focus is shifted back-and-forth", + findElements(By.className("v-window")).size() == 0); + } + + /** + * Scenario: focus close button of opened window -> click close button with + * the mouse cursor -> window should be closed + */ + @Test + public void testMouseClickClosesWindowOnFocus() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(CLOSE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + assertTrue("Window's close button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + + // click button with mouse and wait + closeButton.click(); + sleep(200); + + assertTrue("Window is not closed when focused element is clicked", + findElements(By.className("v-window")).size() == 0); + } + + // Tests for maximize-restore button + + /** + * Scenario: focus the maximize button of the opened window -> press ENTER + * key -> window should be maximized + */ + @Test + public void testMaximizeWindowWithEnter() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + + assertTrue("Window's maximize button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.ENTER); + + assertTrue("Window is not maximized", windowElement.isMaximized()); + } + + /** + * Scenario: focus the maximize button of the opened window -> press SPACE + * key -> window should be maximized + */ + @Test + public void testMaximizeWindowWithSpace() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + + assertTrue("Window's maximize button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.SPACE); + + assertTrue("Window is not maximized", windowElement.isMaximized()); + } + + /** + * Scenario: focus maximize button of opened window -> press keys DELETE, + * ARROW_UP, and ADD -> window should remain open after all actions + */ + @Test + public void testIncorrectKeyInputDoesntFireMaximize() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement maximizeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + setFocusToElementAndWait(maximizeButton); + + assertTrue("Window's maximize button is not the focused element", + maximizeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.DELETE); + assertTrue( + "Window is maximized by DELETE when maximize button is the focused element", + !windowElement.isMaximized()); + + pressKeyAndWait(Keys.ARROW_UP); + assertTrue( + "Window is cmaximized by ARROW_UP when maximize button is the focused element", + !windowElement.isMaximized()); + + pressKeyAndWait(Keys.ADD); + assertTrue( + "Window is maximized by ADD when maximize button is the focused element", + !windowElement.isMaximized()); + } + + /** + * Scenario: close button of opened window is not focused -> press keys + * ENTER and SPACE -> window should remain non-maximized after all actions + */ + @Test + public void testNonfocusedKeyDoesntMaximizeWindow() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement maximizeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + assertTrue("Window's close button is the focused element", + !maximizeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.ENTER); + assertTrue( + "Window is maximized by ENTER when maximize button is not the focused element", + !windowElement.isMaximized()); + + pressKeyAndWait(Keys.SPACE); + assertTrue( + "Window is maximized by SPACE when maximize button is not the focused element", + !windowElement.isMaximized()); + } + + /** + * Scenario: focus maximize button of opened window -> press keys TAB, and + * TAB+SHIFT in succession, shifting focus from and back to the button -> + * press ENTER key -> window should be maximized + */ + @Test + public void testShiftFocusAndMaximizeWindow() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement maximizeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + setFocusToElementAndWait(maximizeButton); + assertTrue("Window's maximize button is not the focused element", + maximizeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.TAB); + assertTrue("Window's maximize button is the focused element", + !maximizeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.SHIFT, Keys.TAB); + assertTrue("Window's maximize button is not the focused element", + maximizeButton.equals(driver.switchTo().activeElement())); + + pressKeyAndWait(Keys.ENTER); + assertTrue( + "Window is not maximized when focus is shifted back-and-forth", + windowElement.isMaximized()); + } + + /** + * Scenario: focus maximize button of opened window -> click maximize button + * with mouse cursor -> window should be maximized + */ + @Test + public void testMouseClickMaximizesWindowOnFocus() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement maximizeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + setFocusToElementAndWait(maximizeButton); + assertTrue("Window's maximize button is not the focused element", + maximizeButton.equals(driver.switchTo().activeElement())); + + // click button with mouse and wait + maximizeButton.click(); + sleep(100); + + assertTrue("Window is not maximized when focused element is clicked", + windowElement.isMaximized()); + } + + /** + * Scenario: focus the maximize button of the opened window -> press ENTER + * key -> window should be maximized -> press ENTER key again -> window + * should be restored + */ + @Test + public void testMaximizeAndRestoreWindowWithEnter() throws IOException { + + assertTrue("Window is not open", + findElements(By.id("testWindow")).size() == 1); + + WindowElement windowElement = $(WindowElement.class).first(); + WebElement closeButton = windowElement + .findElement(By.className(MAXIMIZE_BOX_CLASS)); + setFocusToElementAndWait(closeButton); + + assertTrue("Window's maximize button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.ENTER); + + assertTrue("Window is not maximized", windowElement.isMaximized()); + + assertTrue("Window's maximize button is not the focused element", + closeButton.equals(driver.switchTo().activeElement())); + pressKeyAndWait(Keys.ENTER); + + assertTrue("Window remains maximized", !windowElement.isMaximized()); + } + + protected void setFocusToElementAndWait(WebElement element) { + String elementId = element.getAttribute("id"); + + ((JavascriptExecutor) getDriver()).executeScript( + "document.getElementById('" + elementId + "').focus();", + element); + sleep(100); + } + + protected void pressKeyAndWait(Keys... key) { + new Actions(driver).sendKeys(key).build().perform(); + sleep(100); + } +} |