/* * 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 org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import com.vaadin.testbench.By; import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.elementsbase.AbstractElement; import com.vaadin.testbench.elementsbase.ServerClass; @ServerClass("com.vaadin.ui.Table") @Deprecated public class TableElement extends AbstractSelectElement { /** * Function to find a Table cell. Looking for a cell that is currently not * visible will throw NoSuchElementException * * @param row * 0 based row index * @param column * 0 based column index * @return TestBenchElement containing wanted cell. * @throws NoSuchElementException * if the cell (row, column) is not found. */ public TestBenchElement getCell(int row, int column) { TestBenchElement cell = wrapElement( findElement(By.vaadin("#row[" + row + "]/col[" + column + "]")), getCommandExecutor()); return cell; } /** * Return table row element by zero-based index * * @return table row element by zero-based index */ public TableRowElement getRow(int row) { TestBenchElement rowElem = wrapElement( findElement(By.vaadin("#row[" + row + "]")), getCommandExecutor()); return rowElem.wrap(TableRowElement.class); } /** * Returns the header cell with the given column index. * * @param column * 0 based column index * @return TableHeaderElement containing the wanted header cell */ public TableHeaderElement getHeaderCell(int column) { TestBenchElement headerCell = wrapElement( findElement(By.vaadin("#header[" + column + "]")), getCommandExecutor()); return headerCell.wrap(TableHeaderElement.class); } /** * Function to get footer cell with given column index * * @param column * 0 based column index * @return TestBenchElement containing wanted footer cell */ public TestBenchElement getFooterCell(int column) { TestBenchElement footerCell = wrapElement( findElement(By.vaadin("#footer[" + column + "]")), getCommandExecutor()); return footerCell; } @Override public void scroll(int scrollTop) { ((TestBenchElement) findElement(By.className("v-scrollable"))) .scroll(scrollTop); } @Override public void scrollLeft(int scrollLeft) { ((TestBenchElement) findElement(By.className("v-scrollable"))) .scrollLeft(scrollLeft); } @Override public void contextClick() { WebElement tbody = findElement(By.className("v-table-body")); // There is a problem in with phantomjs driver, just calling // contextClick() doesn't work. We have to use javascript. if (isPhantomJS()) { JavascriptExecutor js = getCommandExecutor(); String scr = "var element=arguments[0];" + "var ev = document.createEvent('HTMLEvents');" + "ev.initEvent('contextmenu', true, false);" + "element.dispatchEvent(ev);"; js.executeScript(scr, tbody); } else { new Actions(getDriver()).contextClick(tbody).build().perform(); } } public static class ContextMenuElement extends AbstractElement { public WebElement getItem(int index) { return findElement( By.xpath(".//table//tr[" + (index + 1) + "]//td/*")); } } /** * Fetches the context menu for the table * * @return {@link com.vaadin.testbench.elements.TableElement.ContextMenuElement} * @throws java.util.NoSuchElementException * if the menu isn't open */ public ContextMenuElement getContextMenu() { try { WebElement cm = getDriver() .findElement(By.className("v-contextmenu")); return wrapElement(cm, getCommandExecutor()) .wrap(ContextMenuElement.class); } catch (WebDriverException e) { throw new NoSuchElementException("Context menu not found", e); } } /** * Opens the collapse menu of this table and returns the element for it. * * @return collapse menu element */ public CollapseMenuElement openCollapseMenu() { getCollapseMenuToggle().click(); WebElement cm = getDriver() .findElement(By.xpath("//*[@id='PID_VAADIN_CM']")); return wrapElement(cm, getCommandExecutor()) .wrap(CollapseMenuElement.class); } /** * Element representing a collapse menu of a Table. */ public static class CollapseMenuElement extends ContextMenuElement { } /** * Gets the button that shows or hides the collapse menu. * * @return button for opening collapse menu */ public WebElement getCollapseMenuToggle() { return findElement(By.className("v-table-column-selector")); } }