/* * 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.ArrayList; import java.util.List; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; import com.vaadin.testbench.By; import com.vaadin.testbench.TestBench; import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.elementsbase.AbstractElement; import com.vaadin.testbench.elementsbase.ServerClass; @ServerClass("com.vaadin.ui.TabSheet") public class TabSheetElement extends AbstractComponentContainerElement { // a locator that does not lead to selecting tabs from a contained inner // TabSheet (#13735) protected org.openqa.selenium.By byTabCell = By .xpath("./div/table/tbody/tr/td[contains(normalize-space(concat(' ', @class, ' '))," + "normalize-space(' v-tabsheet-tabitem '))]"); private static org.openqa.selenium.By byCaption = By .className("v-captiontext"); private static org.openqa.selenium.By byClosable = By .className("v-tabsheet-caption-close"); /** * Gets a list of Tabs inside the Tab container. * * @return List of tabs */ public List<String> getTabCaptions() { List<String> tabCaptions = new ArrayList<String>(); for (WebElement tab : findElements(byTabCell)) { tabCaptions.add(getTabCaption(tab)); } return tabCaptions; } /** * Gets the number of tabs contained in this tab sheet. * * @return Number of tabs. */ public int getTabCount() { return findElements(byTabCell).size(); } /** * Opens the tab with the given index. * * @param index * The zero-based index of the tab to be opened. */ public void openTab(int index) { List<WebElement> tabs = findElements(byTabCell); if (index < 0 || index >= tabs.size()) { throw new NoSuchElementException( "The tab sheet does not contain a tab with index " + index + "."); } openTab(tabs.get(index)); } /** * Opens a Tab that has caption equal to given tabCaption. * * @param tabCaption * Caption of the tab to be opened */ public void openTab(String tabCaption) { for (WebElement tabCell : findElements(byTabCell)) { String currentCaption = getTabCaption(tabCell); boolean captionMatches = (currentCaption != null && currentCaption.equals(tabCaption)) || (currentCaption == null && tabCaption == null); if (captionMatches) { openTab(tabCell); return; } } throw new NoSuchElementException( "Tab with caption " + tabCaption + " was not found."); } /** * Opens the given tab by clicking its caption text or icon. If the tab has * neither text caption nor icon, clicks at a fixed position. * * @param tabCell * The tab to be opened. */ private void openTab(WebElement tabCell) { // Open the tab by clicking its caption text if it exists. List<WebElement> tabCaptions = tabCell.findElements(byCaption); if (tabCaptions.size() > 0) { tabCaptions.get(0).click(); return; } // If no caption text was found, click the icon of the tab. List<WebElement> tabIcons = tabCell .findElements(By.className("v-icon")); if (tabIcons.size() > 0) { tabIcons.get(0).click(); return; } // If neither text nor icon caption was found, click at a position that // is unlikely to close the tab. ((TestBenchElement) tabCell).click(10, 10); } /** * If the tab with given index is closable, closes it. * * @param index * The index of the tab to be closed */ public void closeTab(int index) { List<WebElement> tabs = findElements(byTabCell); if (index < 0 || index >= tabs.size()) { throw new NoSuchElementException( "The tab sheet does not contain a tab with index " + index + "."); } WebElement tabCell = tabs.get(index); closeTab(tabCell); } /** * If tab with given caption is closable, closes it. * * @param tabCaption * Caption of the tab to be closed */ public void closeTab(String tabCaption) { for (WebElement tabCell : findElements(byTabCell)) { String currentCaption = getTabCaption(tabCell); boolean captionMatches = (currentCaption != null && currentCaption.equals(tabCaption)) || (currentCaption == null && tabCaption == null); if (captionMatches) { closeTab(tabCell); return; } } } /** * Closes the given tab if it is closable. * * @param tabCell * The tab to be closed */ private void closeTab(WebElement tabCell) { try { tabCell.findElement(byClosable).click(); // Going further causes a StaleElementReferenceException. return; } catch (NoSuchElementException e) { // Do nothing. } } /** * Gets TabSheet content and wraps it in given class. * * @param clazz * Components element class * @return TabSheet content wrapped in given class */ public <T extends AbstractElement> T getContent(Class<T> clazz) { return TestBench.createElement(clazz, $$(AbstractComponentElement.class).first().getWrappedElement(), getCommandExecutor()); } /** * Returns the caption text of the given tab. If the tab has no caption, * returns null. * * @param tabCell * A web element representing a tab, as given by * findElements(byTabCell).get(index). * @return The caption of tabCell or null if tabCell has no caption. */ private String getTabCaption(WebElement tabCell) { List<WebElement> captionElements = tabCell.findElements(byCaption); if (captionElements.size() == 0) { return null; } else { return captionElements.get(0).getText(); } } }