/* * Copyright 2000-2016 Vaadin Ltd. * * Licensed 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 com.vaadin.v7.tests.components.grid.basicfeatures; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.elements.GridElement; import com.vaadin.testbench.elements.GridElement.GridCellElement; import com.vaadin.testbench.parallel.TestCategory; import com.vaadin.tests.tb3.MultiBrowserTest; @TestCategory("grid") public abstract class GridBasicFeaturesTest extends MultiBrowserTest { public enum CellSide { LEFT, RIGHT; } @Override protected boolean requireWindowFocusForIE() { return true; } @Override protected Class<?> getUIClass() { return GridBasicFeatures.class; } protected GridElement getGridElement() { return ((TestBenchElement) findElement(By.id("testComponent"))) .wrap(GridElement.class); } protected void scrollGridVerticallyTo(double px) { executeScript("arguments[0].scrollTop = " + px, getGridVerticalScrollbar()); } protected void scrollGridHorizontallyTo(double px) { executeScript("arguments[0].scrollLeft = " + px, getGridHorizontalScrollbar()); } protected int getGridVerticalScrollPos() { return ((Number) executeScript("return arguments[0].scrollTop", getGridVerticalScrollbar())).intValue(); } protected List<TestBenchElement> getGridHeaderRowCells() { List<TestBenchElement> headerCells = new ArrayList<>(); for (int i = 0; i < getGridElement().getHeaderCount(); ++i) { headerCells.addAll(getGridElement().getHeaderCells(i)); } return headerCells; } protected List<TestBenchElement> getGridFooterRowCells() { List<TestBenchElement> footerCells = new ArrayList<>(); for (int i = 0; i < getGridElement().getFooterCount(); ++i) { footerCells.addAll(getGridElement().getFooterCells(i)); } return footerCells; } protected WebElement getEditor() { List<WebElement> elems = getGridElement() .findElements(By.className("v-grid-editor")); assertLessThanOrEqual("number of editors", elems.size(), 1); return elems.isEmpty() ? null : elems.get(0); } private Object executeScript(String script, WebElement element) { final WebDriver driver = getDriver(); if (driver instanceof JavascriptExecutor) { final JavascriptExecutor je = (JavascriptExecutor) driver; return je.executeScript(script, element); } else { throw new IllegalStateException("current driver " + getDriver().getClass().getName() + " is not a " + JavascriptExecutor.class.getSimpleName()); } } protected WebElement getGridVerticalScrollbar() { return getDriver().findElement(By.xpath( "//div[contains(@class, \"v-grid-scroller-vertical\")]")); } protected WebElement getGridHorizontalScrollbar() { return getDriver().findElement(By.xpath( "//div[contains(@class, \"v-grid-scroller-horizontal\")]")); } /** * Reloads the page without restartApplication. This occasionally breaks * stuff. */ protected void reopenTestURL() { String testUrl = getTestUrl(); testUrl = testUrl.replace("?restartApplication", "?"); testUrl = testUrl.replace("?&", "?"); driver.get(testUrl); } protected void focusCell(int row, int column) { getGridElement().getCell(row, column).click(); } protected void setFrozenColumns(int numberOfFrozenColumns) { selectMenuPath("Component", "State", "Frozen column count", Integer.toString(numberOfFrozenColumns)); } protected void assertColumnHeaderOrder(int... indices) { List<TestBenchElement> headers = getGridHeaderRowCells(); for (int i = 0; i < indices.length; i++) { assertColumnHeader("Column " + indices[i], headers.get(i)); } } protected void assertColumnHeader(String expectedHeaderCaption, TestBenchElement testBenchElement) { assertEquals(expectedHeaderCaption.toLowerCase(), testBenchElement.getText().toLowerCase()); } protected GridCellElement getDefaultColumnHeader(int index) { List<GridCellElement> headerRowCells = getGridElement() .getHeaderCells(0); return headerRowCells.get(index); } protected void dragAndDropDefaultColumnHeader(int draggedColumnHeaderIndex, int onTopOfColumnHeaderIndex, CellSide cellSide) { GridCellElement columnHeader = getDefaultColumnHeader( onTopOfColumnHeaderIndex); new Actions(getDriver()) .clickAndHold(getDefaultColumnHeader(draggedColumnHeaderIndex)) .moveToElement(columnHeader, getHorizontalOffsetForDragAndDrop( columnHeader, cellSide), 0) .release().perform(); } private int getHorizontalOffsetForDragAndDrop(GridCellElement columnHeader, CellSide cellSide) { if (cellSide == CellSide.LEFT) { return 5; } else { int half = columnHeader.getSize().getWidth() / 2; return half + (half / 2); } } protected void dragAndDropColumnHeader(int headerRow, int draggedColumnHeaderIndex, int onTopOfColumnHeaderIndex, CellSide cellSide) { GridCellElement headerCell = getGridElement().getHeaderCell(headerRow, onTopOfColumnHeaderIndex); new Actions(getDriver()) .clickAndHold(getGridElement().getHeaderCell(headerRow, draggedColumnHeaderIndex)) .moveToElement(headerCell, getHorizontalOffsetForDragAndDrop(headerCell, cellSide), 0) .release().perform(); } protected void dragAndDropColumnHeader(int headerRow, int draggedColumnHeaderIndex, int onTopOfColumnHeaderIndex, int horizontalOffset) { GridCellElement headerCell = getGridElement().getHeaderCell(headerRow, onTopOfColumnHeaderIndex); new Actions(getDriver()) .clickAndHold(getGridElement().getHeaderCell(headerRow, draggedColumnHeaderIndex)) .moveToElement(headerCell, horizontalOffset, 0).release() .perform(); } protected void assertColumnIsSorted(int index) { WebElement columnHeader = getDefaultColumnHeader(index); assertTrue(columnHeader.getAttribute("class").contains("sort")); } protected void assertFocusedCell(int row, int column) { assertTrue(getGridElement().getCell(row, column).getAttribute("class") .contains("focused")); } protected WebElement getSidebarPopup() { List<WebElement> elements = findElements( By.className("v-grid-sidebar-popup")); if (elements.isEmpty()) { getSidebarOpenButton().click(); elements = findElements(By.className("v-grid-sidebar-popup")); } return elements.isEmpty() ? null : elements.get(0); } protected WebElement getSidebarPopupIfPresent() { List<WebElement> elements = findElements( By.className("v-grid-sidebar-popup")); return elements.isEmpty() ? null : elements.get(0); } protected WebElement getSidebarOpenButton() { List<WebElement> elements = findElements( By.className("v-grid-sidebar-button")); return elements.isEmpty() ? null : elements.get(0); } /** * Returns the toggle inside the sidebar for hiding the column at the given * index, or null if not found. */ protected WebElement getColumnHidingToggle(int columnIndex) { WebElement sidebar = getSidebarPopup(); List<WebElement> elements = sidebar .findElements(By.className("column-hiding-toggle")); for (WebElement e : elements) { if ((e.getText().toLowerCase()) .startsWith("column " + columnIndex)) { return e; } } return null; } protected void toggleColumnHidden(int column) { selectMenuPath("Component", "Columns", "Column " + column, "Hidden"); } }