/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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 org.uberfire.wbtest.selenium; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import static org.junit.Assert.*; /** * A Selenium Page Object for interacting with a MultiTabWorkbenchPanelView. */ public class MultiTabPanelWrapper extends AbstractWorkbenchPanelWrapper { public MultiTabPanelWrapper(WebDriver driver, String panelId) { super(driver, panelId); } /** * Returns the <li> elements of all the tabs that are not nested under the dropdown tab. The returned list * will include the dropdown tab if it's currently displayed. */ public List<WebElement> getNonNestedTabs() { return driver.findElements(By.cssSelector(".nav.nav-tabs > li")); } /** * Returns the <li> elements of all the tabs that are nested under the dropdown tab. */ public List<WebElement> getNestedTabs() { return driver.findElements(By.cssSelector(".dropdown-menu > li")); } /** * Returns the dropdown tab if it is present. Contains an <a> tag (the tab UI itself) and a nested <ul> * (the dropdown menu). Returns null if the dropdown is not currently visible. */ public WebElement getDropdownTab() { List<WebElement> dropdowns = driver.findElements(By.cssSelector(".nav.nav-tabs > li.dropdown")); if (dropdowns.isEmpty()) { return null; } if (dropdowns.size() > 1) { fail("Found too many dropdown tabs: " + dropdowns); } return dropdowns.get(0); } /** * Returns the current label text of the dropdown tab itself. */ public String getDropdownTabLabel() { WebElement dropdownTab = getDropdownTab(); return dropdownTab.findElement(By.cssSelector("a.dropdown-toggle")).getText(); } /** * Returns the currently-selected tab that is not the dropdown tab (but might be a tab nested under the dropdown). * Returns null if no tab is selected (should only happen when there are no tabs at all). Causes test failure if * multiple tabs are selected (other than the dropdown tab). */ public WebElement getSelectedTab() { WebElement foundTab = null; for (WebElement selectedTab : driver.findElements(By.cssSelector("li.active"))) { if (selectedTab.getAttribute("class").contains("dropdown")) { continue; } if (foundTab != null) { fail("Too many selected tabs! Found \"" + foundTab.getText() + "\" and \"" + selectedTab.getText() + "\""); } foundTab = selectedTab; } return foundTab; } /** * Returns the label of the currently-selected tab (which may be under the dropdown, but will not return the label * of the dropdown tab itself). */ public String getSelectedTabLabel() throws InterruptedException { WebElement selectedTab = getSelectedTab(); if (selectedTab == null) { return null; } // selenium only returns text of visible elements, so we have to open the dropdown WebElement dropdownTab = getDropdownTab(); if (dropdownTab != null) { dropdownTab.findElement(By.tagName("a")).click(); } String allText = selectedTab.findElement(By.tagName("a")).getText(); String buttonText = selectedTab.findElement(By.tagName("button")).getText(); if (dropdownTab != null) { dropdownTab.click(); } return allText.substring(0, allText.indexOf(buttonText)).trim(); } /** * Clicks on the close button of the currently selected tab. Fails the test if no tab is selected. */ public void closeSelectedTab() { WebElement selectedTab = getSelectedTab(); if (selectedTab == null) { fail("No tab is selected"); } selectedTab.findElement(By.tagName("button")).click(); } /** * Closes the tab that contains the given text in its label. The tab need not be the currently selected tab. * @param label the label of the tab. Beware that the match is done by partial link text (because the close button * gets in the way of exact matching) so ensure the given text is not a substring of some other tab's label! */ public void closeTab(String label) { WebElement tab = driver.findElement(By.partialLinkText(label)); tab.findElement(By.tagName("button")).click(); } }