Java tutorial
/* Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.portals.pluto.demo.integration.test; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.NoSuchElementException; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.Keys; import org.openqa.selenium.support.ui.Select; import static org.apache.portals.pluto.demo.integration.test.Util.*; import org.openqa.selenium.JavascriptExecutor; import static org.openqa.selenium.support.ui.ExpectedConditions.*; /** * * @author Kyle Stiemann */ public class PortletHubDemoIT extends DemoTestDriver { private static final List<String> IMAGE_OPTIONS = Util.unmodifiableList("golfball", "baseball", "fussball"); private static final String TOKEN = "{0}"; private static final String IMAGE_XPATH_TEMPLATE = "//img[contains(@src,'/hub-demo-portlet/resources/images/" + TOKEN + ".gif')]"; @Test public void testPortletHubDemo() throws UnsupportedEncodingException { navigateToPage("V3.0 Portlet Hub Demo"); // Verify that all the different images appear when clicking each radio button. By imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, "FullMoon")); waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath)); for (String imageName : IMAGE_OPTIONS) { clickElement(driver, waitingAsserter, getXpath("div", "hub_demo_portlet", "ImageSelPortlet") + "/input[@value='" + imageName + "']"); waitingAsserter.assertTrue(elementNotPresentOrNotVisible(imageByXpath)); imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, imageName + "-trans")); waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath)); } // Verify that all the different images appear when clicking each dropdown option. clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "ImageSelPortlet", "dropdown"); By imageSelectByXpath = By .xpath(getXpath("select", "hub_demo_portlet", "ImageSelPortlet") + "[@name='imgName']"); waitingAsserter.waitFor(elementToBeClickable(imageSelectByXpath)); Select select = new Select(driver.findElement(imageSelectByXpath)); select.selectByValue("default"); imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, "FullMoon")); waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath)); for (String imageName : IMAGE_OPTIONS) { select = new Select(driver.findElement(imageSelectByXpath)); select.selectByValue(imageName); waitingAsserter.assertTrue(elementNotPresentOrNotVisible(imageByXpath)); imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, imageName + "-trans")); waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath)); } // Verify that the border checkbox shows and hides the border on the image. waitingAsserter .assertTrue(and(visibilityOfElementLocated(imageByXpath), attributeEmpty(imageByXpath, "style"))); clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP", "border"); waitingAsserter.assertTrue( and(visibilityOfElementLocated(imageByXpath), attributeContains(imageByXpath, "style", "border:"))); // Verify that the different cacheability radion buttons change the visible cacheability text. String cacheabilityRadioButtonXpathTemplate = getXpath("input", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP") + "[@value='" + TOKEN + "']"; String resourcePortletDivXpath = getXpath("div", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP"); By actionButtonByXpath = By.xpath(resourcePortletDivXpath + "//input[@value='Action']"); for (String cacheability : Util.unmodifiableList("Portlet", "Full", "Page")) { String cacheabilityResultXpath = resourcePortletDivXpath + "//p[contains(text(),'Cacheability')]"; waitingAsserter.assertTrue(elementNotPresentOrNotVisible( By.xpath(cacheabilityResultXpath + "[contains(text(),'" + cacheability + "')]"))); String cacheabilityRadioButtonXpath = cacheabilityRadioButtonXpathTemplate.replace(TOKEN, cacheability.toUpperCase(Locale.ENGLISH)); clickElement(driver, waitingAsserter, cacheabilityRadioButtonXpath); By cacheabilityResultByXpath = By.xpath(cacheabilityResultXpath); waitingAsserter.assertTrue(and(visibilityOfElementLocated(cacheabilityResultByXpath), textToBePresentInElementLocated(cacheabilityResultByXpath, cacheability))); if ("Page".equalsIgnoreCase(cacheability)) { waitingAsserter.assertTrue(visibilityOfElementLocated(actionButtonByXpath)); } else { waitingAsserter.assertTrue(visibilityOfElementLocated( By.xpath(resourcePortletDivXpath + "[contains(.,'Action URL could not be created.')]"))); } } // Click the Action button. clickElement(driver, waitingAsserter, actionButtonByXpath); waitingAsserter.assertTrue(visibilityOfElementLocated(actionButtonByXpath)); // Verify the background color changes. navigateToPage("V3.0 Portlet Hub Demo"); ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,document.body.scrollHeight);"); By coloredTableByXpath = By .xpath(getXpath("div", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP", "putResourceHere") + "//table[@style]"); waitingAsserter.assertTrue(and(visibilityOfElementLocated(coloredTableByXpath), backgroundColor(coloredTableByXpath, 0xFF, 0xFF, 0xFF))); String colorInputXpath = getXpath("input", "hub_demo_portlet", "PH", "ColorSelPortlet", "color"); sendKeysToElement(driver, waitingAsserter, colorInputXpath, "#FF0000", Keys.ENTER); waitingAsserter.assertTrue(and(visibilityOfElementLocated(coloredTableByXpath), backgroundColor(coloredTableByXpath, 0xFF, 0, 0))); // Verify that messages can be sent in different colors by different methods. for (String formSubmissionMethod : Util.unmodifiableList("URL", "form")) { for (ColorCombo colorCombo : ColorCombo.getAllPossibleCombos()) { String lowerCaseFormSubmissionMethod = formSubmissionMethod.toLowerCase(Locale.ENGLISH); clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PH", "ColorSelPortlet", lowerCaseFormSubmissionMethod); testMessageSent(colorCombo); } clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "MessageBoxPortlet", "clear"); } // Click the Do Partial Action button and check that the reponse text appears. By responseDivByXpath = By .xpath(getXpath("div", "hub_demo_portlet", "PartialActionPortlet", "responseDiv")); waitingAsserter.assertTrue(textEmpty(responseDivByXpath)); for (int i = 1; i <= 10; i++) { clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PartialActionPortlet", "doPA"); waitingAsserter .assertTrue(and(visibilityOfElementLocated(responseDivByXpath), textToBePresentInElementLocated( responseDivByXpath, "Partial Action has been executed " + i + " times."))); } } private void testMessageSent(ColorCombo colorCombo) { handleColorCheckbox("red", colorCombo.isRedSelected()); handleColorCheckbox("green", colorCombo.isGreenSelected()); handleColorCheckbox("blue", colorCombo.isBlueSelected()); String messageInputXpath = getXpath("input", "hub_demo_portlet", "PH", "ColorSelPortlet", "msg"); String message = colorCombo.getHexString(); sendKeysToElement(driver, waitingAsserter, messageInputXpath, message); clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PH", "ColorSelPortlet", "send"); By messageOutputByXpath = By.xpath(getXpath("div", "hub_demo_portlet", "MessageBoxPortlet", "responseDiv") + "/p[contains(text(),'" + colorCombo.getIndex() + ": " + message + "')]"); waitingAsserter .assertTrue(and(visibilityOfElementLocated(messageOutputByXpath), or(attributeContains(messageOutputByXpath, "style", "color:#" + message + ";"), attributeContains(messageOutputByXpath, "style", "color: " + colorCombo.getCSS_RGBString() + ";")))); } private void handleColorCheckbox(String colorName, boolean colorSelected) { WebElement colorCheckbox = driver .findElement(By.xpath(getXpath("input", "hub_demo_portlet", "PH", "ColorSelPortlet", colorName))); if ((colorSelected && !colorCheckbox.isSelected()) || (!colorSelected && colorCheckbox.isSelected())) { colorCheckbox.click(); } } private static final class ColorCombo { // Constants private static final byte BLUE_BIT_POSITION = 0; private static final byte GREEN_BIT_POSITION = BLUE_BIT_POSITION + 1; private static final byte RED_BIT_POSITION = GREEN_BIT_POSITION + 1; private static final byte BINARY_STRING_LENGTH = RED_BIT_POSITION + 1; // Data private final byte selectedColorsInBinary; public ColorCombo(byte selectedColorsInBinary) { this.selectedColorsInBinary = selectedColorsInBinary; } public boolean isRedSelected() { return isColorSelected(selectedColorsInBinary, RED_BIT_POSITION); } public boolean isGreenSelected() { return isColorSelected(selectedColorsInBinary, GREEN_BIT_POSITION); } public boolean isBlueSelected() { return isColorSelected(selectedColorsInBinary, BLUE_BIT_POSITION); } public String getCSS_RGBString() { return "rgb(" + getBinaryString().replace("", " ").trim().replace(" ", ", ").replace("1", Integer.toString(0xFF)) + ")"; } public String getHexString() { return "#" + getBinaryString().replace("1", "F"); } public String getIndex() { return Integer.toString(selectedColorsInBinary + 1); } private String getBinaryString() { return getZeroPaddedString(Integer.toBinaryString(selectedColorsInBinary), BINARY_STRING_LENGTH); } private static boolean isColorSelected(byte selectedColors, byte colorBitPosition) { return ((selectedColors >> colorBitPosition) & 1) == 1; } public static Iterable<ColorCombo> getAllPossibleCombos() { return new AllPossibleCombosIterable(); } private static final class AllPossibleCombosIterator implements Iterator<ColorCombo> { // Constants private static final byte ALL_COLORS = 0b111; private static final byte NO_COLORS = 0b000; // Data private byte selectedColorsInBinary = NO_COLORS; @Override public boolean hasNext() { return selectedColorsInBinary <= ALL_COLORS; } @Override public ColorCombo next() { if (!hasNext()) { throw new NoSuchElementException(); } ColorCombo colorCombo = new ColorCombo(selectedColorsInBinary); selectedColorsInBinary++; return colorCombo; } } private static final class AllPossibleCombosIterable implements Iterable<ColorCombo> { @Override public Iterator<ColorCombo> iterator() { return new AllPossibleCombosIterator(); } } } }