Skip to content

Commit

Permalink
Merge branch '7.4.0' into master
Browse files Browse the repository at this point in the history
Change-Id: I81fa84bbcbd7f5ff029499683b3e516c3469632a
  • Loading branch information
zch committed Feb 18, 2015
2 parents 7beee4d + bfe943a commit 5367602
Showing 1 changed file with 364 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,364 @@
/**
* Copyright (C) 2012 Vaadin Ltd
*
* This program is available under Commercial Vaadin Add-On License 3.0
* (CVALv3).
*
* See the file licensing.txt distributed with this software for more
* information about licensing.
*
* You should have received a copy of the license along with this program.
* If not, see <http://vaadin.com/license/cval-3>.
*/
package com.vaadin.testbench.elements;

import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebElement;

import com.vaadin.testbench.By;
import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elementsbase.AbstractElement;
import com.vaadin.testbench.elementsbase.ServerClass;

/**
* TestBench Element API for Grid
*
* @since
* @author Vaadin Ltd
*/
@ServerClass("com.vaadin.ui.Grid")
public class GridElement extends AbstractComponentElement {

public static class GridCellElement extends AbstractElement {

private static final String FOCUSED_CELL_CLASS_NAME = "-cell-focused";
private static final String FROZEN_CLASS_NAME = "frozen";

public boolean isFocused() {
return getAttribute("class").contains(FOCUSED_CELL_CLASS_NAME);
}

public boolean isFrozen() {
return getAttribute("class").contains(FROZEN_CLASS_NAME);
}
}

public static class GridRowElement extends AbstractElement {

private static final String FOCUSED_CLASS_NAME = "-row-focused";
private static final String SELECTED_CLASS_NAME = "-row-selected";

public boolean isFocused() {
return getAttribute("class").contains(FOCUSED_CLASS_NAME);
}

@Override
public boolean isSelected() {
return getAttribute("class").contains(SELECTED_CLASS_NAME);
}
}

public static class GridEditorElement extends AbstractElement {

private GridElement grid;

private GridEditorElement setGrid(GridElement grid) {
this.grid = grid;
return this;
}

/**
* Gets the editor field for column in given index.
*
* @param colIndex
* the column index
* @return the editor field for given location
*
* @throws NoSuchElementException
* if {@code isEditable(colIndex) == false}
*/
public TestBenchElement getField(int colIndex) {
return grid.getSubPart("#editor[" + colIndex + "]");
}

/**
* Gets whether the column with the given index is editable, that is,
* has an associated editor field.
*
* @param colIndex
* the column index
* @return {@code true} if the column has an editor field, {@code false}
*  otherwise
*/
public boolean isEditable(int colIndex) {
return grid
.isElementPresent(By.vaadin("#editor[" + colIndex + "]"));
}

/**
* Checks whether a field is marked with an error.
*
* @param colIndex
* column index
* @return <code>true</code> iff the field is marked with an error
*/
public boolean isFieldErrorMarked(int colIndex) {
return getField(colIndex).getAttribute("class").contains("error");
}

/**
* Saves the fields of this editor.
* <p>
* <em>Note:</em> that this closes the editor making this element
* useless.
*/
public void save() {
findElement(By.className("v-grid-editor-save")).click();
}

/**
* Cancels this editor.
* <p>
* <em>Note:</em> that this closes the editor making this element
* useless.
*/
public void cancel() {
findElement(By.className("v-grid-editor-cancel")).click();
}

/**
* Gets the error message text, or <code>null</code> if no message is
* present.
*/
public String getErrorMessage() {
WebElement messageWrapper = findElement(By
.className("v-grid-editor-message"));
List<WebElement> divs = messageWrapper.findElements(By
.tagName("div"));
if (divs.isEmpty()) {
return null;
} else {
return divs.get(0).getText();
}
}
}

/**
* Scrolls Grid element so that wanted row is displayed
*
* @param index
* Target row
*/
public void scrollToRow(int index) {
try {
getSubPart("#cell[" + index + "]");
} catch (NoSuchElementException e) {
// Expected, ignore it.
}
}

/**
* Gets cell element with given row and column index.
*
* @param rowIndex
* Row index
* @param colIndex
* Column index
* @return Cell element with given indices.
*/
public GridCellElement getCell(int rowIndex, int colIndex) {
scrollToRow(rowIndex);
return getSubPart("#cell[" + rowIndex + "][" + colIndex + "]").wrap(
GridCellElement.class);
}

/**
* Gets row element with given row index.
*
* @param index
* Row index
* @return Row element with given index.
*/
public GridRowElement getRow(int index) {
scrollToRow(index);
return getSubPart("#cell[" + index + "]").wrap(GridRowElement.class);
}

/**
* Gets header cell element with given row and column index.
*
* @param rowIndex
* Row index
* @param colIndex
* Column index
* @return Header cell element with given indices.
*/
public GridCellElement getHeaderCell(int rowIndex, int colIndex) {
return getSubPart("#header[" + rowIndex + "][" + colIndex + "]").wrap(
GridCellElement.class);
}

/**
* Gets footer cell element with given row and column index.
*
* @param rowIndex
* Row index
* @param colIndex
* Column index
* @return Footer cell element with given indices.
*/
public GridCellElement getFooterCell(int rowIndex, int colIndex) {
return getSubPart("#footer[" + rowIndex + "][" + colIndex + "]").wrap(
GridCellElement.class);
}

/**
* Gets list of header cell elements on given row.
*
* @param rowIndex
* Row index
* @return Header cell elements on given row.
*/
public List<GridCellElement> getHeaderCells(int rowIndex) {
List<GridCellElement> headers = new ArrayList<GridCellElement>();
for (TestBenchElement e : TestBenchElement.wrapElements(
getSubPart("#header[" + rowIndex + "]").findElements(
By.xpath("./th")), getCommandExecutor())) {
headers.add(e.wrap(GridCellElement.class));
}
return headers;
}

/**
* Gets list of header cell elements on given row.
*
* @param rowIndex
* Row index
* @return Header cell elements on given row.
*/
public List<GridCellElement> getFooterCells(int rowIndex) {
List<GridCellElement> footers = new ArrayList<GridCellElement>();
for (TestBenchElement e : TestBenchElement.wrapElements(
getSubPart("#footer[" + rowIndex + "]").findElements(
By.xpath("./td")), getCommandExecutor())) {
footers.add(e.wrap(GridCellElement.class));
}
return footers;
}

/**
* Get header row count
*
* @return Header row count
*/
public int getHeaderCount() {
return getSubPart("#header").findElements(By.xpath("./tr")).size();
}

/**
* Get footer row count
*
* @return Footer row count
*/
public int getFooterCount() {
return getSubPart("#footer").findElements(By.xpath("./tr")).size();
}

/**
* Get a header row by index
*
* @param rowIndex
* Row index
* @return The th element of the row
*/
public TestBenchElement getHeaderRow(int rowIndex) {
return getSubPart("#header[" + rowIndex + "]");
}

/**
* Get a footer row by index
*
* @param rowIndex
* Row index
* @return The tr element of the row
*/
public TestBenchElement getFooterRow(int rowIndex) {
return getSubPart("#footer[" + rowIndex + "]");
}

/**
* Get the vertical scroll element
*
* @return The element representing the vertical scrollbar
*/
public TestBenchElement getVerticalScroller() {
List<WebElement> rootElements = findElements(By.xpath("./div"));
return (TestBenchElement) rootElements.get(0);
}

/**
* Get the horizontal scroll element
*
* @return The element representing the horizontal scrollbar
*/
public TestBenchElement getHorizontalScroller() {
List<WebElement> rootElements = findElements(By.xpath("./div"));
return (TestBenchElement) rootElements.get(1);
}

/**
* Get the header element
*
* @return The thead element
*/
public TestBenchElement getHeader() {
return getSubPart("#header");
}

/**
* Get the body element
*
* @return the tbody element
*/
public TestBenchElement getBody() {
return getSubPart("#cell");
}

/**
* Get the footer element
*
* @return the tfoot element
*/
public TestBenchElement getFooter() {
return getSubPart("#footer");
}

/**
* Get the element wrapping the table element
*
* @return The element that wraps the table element
*/
public TestBenchElement getTableWrapper() {
List<WebElement> rootElements = findElements(By.xpath("./div"));
return (TestBenchElement) rootElements.get(2);
}

public GridEditorElement getEditor() {
return getSubPart("#editor").wrap(GridEditorElement.class)
.setGrid(this);
}

/**
* Helper function to get Grid subparts wrapped correctly
*
* @param subPartSelector
* SubPart to be used in ComponentLocator
* @return SubPart element wrapped in TestBenchElement class
*/
private TestBenchElement getSubPart(String subPartSelector) {
return (TestBenchElement) findElement(By.vaadin(subPartSelector));
}
}

0 comments on commit 5367602

Please sign in to comment.