/*
* 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.testbench.elements;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebElement;
import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elementsbase.ServerClass;
/**
* Testbench Element API for {@code Tree}.
* <p>
* <strong>Note:</strong> This TreeElement is for the Vaadin 8 version of Tree.
* Use {@link com.vaadin.v7.testbench.elements.TreeElement} for the
* compatibility version.
*
* @author Vaadin Ltd.
* @since 8.1
*/
@ServerClass("com.vaadin.ui.Tree")
public class TreeElement extends AbstractComponentElement {
/**
* Expands the row at the given index in the tree.
*
* @param index
* 0-based row index to expand
*/
public void expand(int index) {
if (isExpanded(index)) {
throw new IllegalStateException(
"The element at row " + index + " was expanded already");
}
getExpandElement(index).click();
}
/**
* Returns whether the row at the given index is expanded or not.
*
* @param index
* 0-based row index
* @return {@code true} if expanded, {@code false} if collapsed
*/
public boolean isExpanded(int index) {
WebElement expandElement = getExpandElement(index);
List<String> classes = Arrays
.asList(expandElement.getAttribute("class").split(" "));
return classes.contains("expanded") && !classes.contains("collapsed");
}
/**
* Returns whether the row at the given index is collapsed or not.
*
* @param rowIndex
* 0-based row index
*
* @return {@code true} if collapsed, {@code false} if expanded
*/
public boolean isCollapsed(int rowIndex) {
return !isExpanded(rowIndex);
}
/**
* Gets the expand/collapse element for the given row.
*
* @param rowIndex
* 0-based row index
* @return the {@code span} element that is clicked for expanding/collapsing
* a row
* @throws NoSuchElementException
* if there is no expand element for this row
*/
public WebElement getExpandElement(int rowIndex) {
return asTreeGrid().getCell(rowIndex, 0)
.findElement(By.className("v-tree8-expander"));
}
/**
* Collapses the row at the given index in the tree.
*
* @param index
* 0-based row index to collapse
*/
public void collapse(int index) {
if (isCollapsed(index)) {
throw new IllegalStateException(
"The element at row " + index + " was collapsed already");
}
getExpandElement(index).click();
}
/**
* Gets all items currently shown in this tree. The returned element objects
* are the rendered contents for each item.
*
* @return list of content elements for all items
*/
public List<TestBenchElement> getAllItems() {
return asTreeGrid().getBody().findElements(By.tagName("tr")).stream()
.map(this::findCellContentFromRow).collect(Collectors.toList());
}
/**
* Gets an item at given index. The returned element object is the rendered
* content in the given index.
*
* @param index
* 0-based row index
* @return content element for item at given index
*/
public TestBenchElement getItem(int index) {
return findCellContentFromRow(asTreeGrid().getRow(index));
}
/**
* Finds the rendered cell content from given row element. This expects the
* row to contain only a single column rendered with TreeRenderer.
*
* @param rowElement
* the row element
* @return cell content element
*/
protected TestBenchElement findCellContentFromRow(WebElement rowElement) {
return TestBenchElement.wrapElement(
rowElement.findElement(By.className("gwt-HTML")),
getCommandExecutor());
}
/**
* Convenience method for accessing the underlying TreeGrid.
*
* @return this tree element as a tree grid element.
*/
protected TreeGridElement asTreeGrid() {
return wrap(TreeGridElement.class);
}
}