package com.persado.oss.quality.stevia.selenium.core.controllers; /* * #%L * Stevia QA Framework - Core * %% * Copyright (C) 2013 - 2014 Persado * %% * Copyright (c) Persado Intellectual Property Limited. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * * Neither the name of the Persado Intellectual Property Limited nor the names * of its contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * #L% */ import com.persado.oss.quality.stevia.network.http.HttpCookie; import com.persado.oss.quality.stevia.selenium.core.SteviaContext; import com.persado.oss.quality.stevia.selenium.core.WebController; import com.persado.oss.quality.stevia.selenium.core.controllers.commonapi.KeyInfo; import com.persado.oss.quality.stevia.selenium.core.controllers.webdriverapi.ByExtended; import com.persado.oss.quality.stevia.selenium.listeners.ReportingWebDriverEventListener; import org.apache.commons.io.FileUtils; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.Cookie; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.OutputType; import org.openqa.selenium.Point; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; //import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.Select; import org.openqa.selenium.support.ui.WebDriverWait; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; //import com.thoughtworks.selenium.Selenium; //import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium; // TODO: Auto-generated Javadoc /** * The Class WebDriverMethods. */ public class WebDriverWebController extends WebControllerBase implements WebController { /** The Constant LOG. */ private static final Logger WEBDRIVER_LOG = LoggerFactory.getLogger(WebDriverWebController.class); /** The driver. */ private WebDriver driver; /** The Constant TO_MILLIS. */ private static final int TO_MILLIS = 1000; /** The Constant THREAD_SLEEP. */ private static final long THREAD_SLEEP = 100; /** The Constant XPATH. */ private static final String XPATH = "xpath"; /** The Constant CSS. */ private static final String CSS = "css"; /** The Constant NAME. */ private static final String NAME = "name"; /** The Constant LINK. */ private static final String LINK = "link"; /** The Constant ID. */ private static final String ID = "id"; /** * Gets the driver. * * @return the driver */ public WebDriver getDriver() { return driver; } /** * Sets the driver. * * @param driver * the new driver */ public void setDriver(WebDriver driver) { this.driver = driver; } /** * Gets the selenium instance. * * @param //baseUrl * the base url * @return the selenium instance */ //public Selenium getSeleniumInstance(String baseUrl) { // return new WebDriverBackedSelenium(driver, baseUrl); //} /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * enableActionsLogging() */ @Override public void enableActionsLogging() { // this.setDriver(new EventFiringWebDriver(driver).register(new ReportingWebDriverEventListener())); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * disableActionsLogging() */ @Override public void disableActionsLogging() { // this.setDriver(new EventFiringWebDriver(driver).unregister(new ReportingWebDriverEventListener())); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * waitForPageLoading(java.lang.String) */ @Override public void waitForCondition(String jscondition) { waitForCondition(jscondition, SteviaContext.getWaitForElement()); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * waitForCondition(java.lang.String, long) */ @Override public void waitForCondition(String jscondition, long waitSeconds) { JavascriptExecutor js = (JavascriptExecutor) driver; boolean conditionResult; long startTime = System.currentTimeMillis(); do { conditionResult = ((Boolean) js.executeScript(jscondition)).booleanValue(); try { Thread.sleep(THREAD_SLEEP); } catch (InterruptedException e) { WEBDRIVER_LOG.error(e.getMessage()); } } while (!conditionResult && System.currentTimeMillis() - startTime <= waitSeconds * TO_MILLIS); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#waitForElement * (org.openqa.selenium.String) */ /** * Find locator substring. * * @param locator the element locator * @return the string after the character '=' */ private String findLocatorSubstring(String locator){ return locator.substring(locator.indexOf('=')+1); } /** * Determine locator. * * @param locator * the locator * @return the by */ public By determineLocator(String locator) { if (locator.startsWith(XPATH)) { return By.xpath(findLocatorSubstring(locator)); } else if (locator.startsWith("//")) { return By.xpath(locator); } else if (locator.startsWith(CSS)) { return ByExtended.cssSelector(findLocatorSubstring(locator)); } else if (locator.startsWith(NAME)) { return By.name(findLocatorSubstring(locator)); } else if (locator.startsWith(LINK)) { return By.linkText(findLocatorSubstring(locator)); } else if (locator.startsWith(ID)) { return By.id(findLocatorSubstring(locator)); } else { return By.id(locator); } } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#waitForElement * (java.lang.String) */ @Override public WebElement waitForElement(String locator) { return waitForElement(locator, SteviaContext.getWaitForElement()); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#waitForElement * (java.lang.String, long) */ @Override public WebElement waitForElement(String locator, long waitSeconds) { WebDriverWait wait = new WebDriverWait(driver, waitSeconds,THREAD_SLEEP); return wait.until(ExpectedConditions.visibilityOfElementLocated(determineLocator(locator))); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * waitForElementInvisibility(java.lang.String) */ @Override public void waitForElementInvisibility(String locator) { waitForElementInvisibility(locator, SteviaContext.getWaitForElementInvisibility()); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * waitForElementInvisibility(java.lang.String, long) */ @Override public void waitForElementInvisibility(String locator, long waitSeconds) { WebDriverWait wait = new WebDriverWait(driver, waitSeconds); wait.until(ExpectedConditions.invisibilityOfElementLocated(determineLocator(locator))); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * waitForElementPresence(java.lang.String) */ public WebElement waitForElementPresence(String locator) { return waitForElementPresence(locator, SteviaContext.getWaitForElement()); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#waitForElement * (java.lang.String) */ public WebElement waitForElementPresence(String locator, long waitSeconds) { WebDriverWait wait = new WebDriverWait(driver, waitSeconds,THREAD_SLEEP); return wait.until(ExpectedConditions.presenceOfElementLocated(determineLocator(locator))); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#findElements * (org.openqa.selenium.String) */ @Override public List<WebElement> findElements(String locator) { WebDriverWait wait = new WebDriverWait(driver, SteviaContext.getWaitForElement(),THREAD_SLEEP); return wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(determineLocator(locator))); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#input( * org.openqa.selenium.String, java.lang.String) */ @Override public void input(String locator, String value) { WebElement element = waitForElement(locator); element.clear(); element.sendKeys(value); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#press( * org.openqa.selenium.String) */ @Override public void press(String locator) { waitForElement(locator).click(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressAndWaitForPageToLoad(java.lang.String) */ @Override public void pressAndWaitForPageToLoad(String locator) { press(locator); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressAndWaitForElement(java.lang.String, java.lang.String, long) */ @Override public void pressAndWaitForElement(String pressLocator, String elementToWaitLocator, long waitSeconds) { press(pressLocator); waitForElement(elementToWaitLocator, waitSeconds); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressAndWaitForElement(java.lang.String, java.lang.String) */ @Override public void pressAndWaitForElement(String pressLocator, String elementToWaitLocator) { pressAndWaitForElement(pressLocator, elementToWaitLocator, SteviaContext.getWaitForElement()); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressAndClickOkInAlert(java.lang.String) */ @Override public void pressAndClickOkInAlert(String locator) { press(locator); clickOkInAlert(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressAndClickOkInAlertNoPageLoad(java.lang.String) */ @Override public void pressAndClickOkInAlertNoPageLoad(String locator) { pressAndClickOkInAlert(locator); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressAndClickCancelInAlert(java.lang.String) */ @Override public void pressAndClickCancelInAlert(String locator) { press(locator); clickCancelInAlert(); } /** * Gets the select object. * * @param locator * the locator * @return the select object */ public Select getSelectObject(String locator) { return new Select(waitForElementPresence(locator)); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#select * (org.openqa.selenium.String, java.lang.String) */ @Override public void select(String locator, String option) { getSelectObject(locator).selectByVisibleText(option); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#selectByValue * (java.lang.String, java.lang.String) */ @Override public void selectByValue(String locator, String value) { getSelectObject(locator).selectByValue(value); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#multiSelectAdd * (java.lang.String, java.lang.String) */ @Override public void multiSelectAdd(String locator, String option) { } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#clear( * org.openqa.selenium.String, java.lang.String) */ @Override public void clear(String locator) { WebElement element = waitForElement(locator); element.clear(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getBuilder * () */ @Override public Actions getBuilder() { return new Actions(driver); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#hover( * org.openqa.selenium.String) */ @Override public void mouseOver(String locator) { getBuilder().moveToElement(waitForElement(locator)).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#mouseUp * (java.lang.String) */ @Override public void mouseUp(String locator) { getBuilder().release(waitForElement(locator)).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#mouseDown * (java.lang.String) */ @Override public void mouseDown(String locator) { getBuilder().clickAndHold(waitForElement(locator)).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#doubleClick * (org.openqa.selenium.String) */ @Override public void doubleClick(String locator) { getBuilder().doubleClick(waitForElement(locator)).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#click( * java.lang.String) */ public void click(String locator) { waitForElement(locator).click(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#typeKeys * (java.lang.String, java.lang.String) */ @Override public void typeKeys(String locator, String value) { waitForElement(locator).sendKeys(value); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#keyDown * (java.lang.String, org.openqa.selenium.Keys) */ @Override public void keyDown(String locator, KeyInfo thekey) { getBuilder().keyDown(waitForElement(locator), thekey.getKey()).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#keyUp( * java.lang.String, org.openqa.selenium.Keys) */ @Override public void keyUp(String locator, KeyInfo thekey) { getBuilder().keyUp(waitForElement(locator), thekey.getKey()).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#keyDown * (org.openqa.selenium.Keys) */ @Override public void keyDown(KeyInfo thekey) { getBuilder().keyDown(thekey.getKey()).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#keyUp( * org.openqa.selenium.Keys) */ @Override public void keyUp(KeyInfo thekey) { getBuilder().keyUp(thekey.getKey()).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#keyPress * (org.openqa.selenium.Keys) */ @Override public void keyPress(KeyInfo thekey) { getBuilder().sendKeys(thekey.getKey()).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#keyPress * (java.lang.String, org.openqa.selenium.Keys) */ @Override public void keyPress(String locator, KeyInfo thekey) { waitForElement(locator).sendKeys(thekey.getKey()); } /** * Highlight. * * @param element * the element */ public void highlight(WebElement element) { executeJavascript("arguments[0].style.backgroundColor = 'rgb(255, 255, 0)'", element); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#highlight * (org.openqa.selenium.String) */ @Override public void highlight(String locator) { executeJavascript("arguments[0].style.backgroundColor = 'rgb(255, 255, 0)'", waitForElement(locator)); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#highlight * (java.lang.String, java.lang.String) */ @Override public void highlight(String locator, String color) { executeJavascript("arguments[0].style.backgroundColor = arguments[1]", waitForElement(locator), color); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#takeScreenShot * (java.io.File, java.lang.String) */ @Override public void takeScreenShot() throws IOException { File scrFile = null; try { scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); } catch (Exception e) { WEBDRIVER_LOG.error("Failed to generate screenshot, problem with driver: {} ", e.getMessage()); } if (scrFile != null) { File file = createScreenshotFile(); FileUtils.copyFile(scrFile, file); reportLogScreenshot(file); } } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getText * (org.openqa.selenium.String) */ @Override public String getText(String locator) { return waitForElement(locator).getText(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getFocus * (java.lang.String) */ @Override public void getFocus(String locator) { WebElement element = waitForElement(locator); if ("input".equals(element.getTagName())) { element.sendKeys(""); } else { new Actions(driver).moveToElement(element).perform(); } } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getSelectedLabel(org.openqa.selenium.String) */ @Override public String getSelectedOption(String locator) { return getSelectObject(locator).getFirstSelectedOption().getText(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getSelectOptions(org.openqa.selenium.String) */ @Override public List<String> getSelectedOptions(String locator) { List<String> optionValues = new ArrayList<String>(); Select menuList = getSelectObject(locator); List<WebElement> options = menuList.getAllSelectedOptions(); for (WebElement option : options) { optionValues.add(option.getText()); } return optionValues; } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getInputValue * (org.openqa.selenium.String) */ @Override public String getInputValue(String locator) { return waitForElement(locator).getAttribute("value"); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#isAlertPresent * () */ @Override public boolean isAlertPresent() { WebDriverWait wait = new WebDriverWait(driver, 0); try { wait.until(ExpectedConditions.alertIsPresent()); return true; } catch (Exception e) { return false; } } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#isTextPresent * (java.lang.String) */ @Override public boolean isTextPresent(String value) { return driver.getPageSource().contains(value); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isTextNotPresent(java.lang.String) */ @Override public boolean isTextNotPresent(String value) { return !driver.getPageSource().contains(value); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#refresh() */ @Override public String getPageSource() { return driver.getPageSource(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentEditable(org.openqa.selenium.String) */ @Override public boolean isComponentEditable(String locator) { return waitForElement(locator).isEnabled(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentDisabled(org.openqa.selenium.String) */ @Override public boolean isComponentDisabled(String locator) { return !waitForElement(locator).isEnabled(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentPresent(org.openqa.selenium.String) */ @Override public boolean isComponentPresent(String locator) { return driver.findElements(determineLocator(locator)).size() != 0; } /** * Switch to window. */ public void switchToWindow() { Set<String> availableWindows = driver.getWindowHandles(); Iterator<String> itr = availableWindows.iterator(); String lastElement = itr.next(); while (itr.hasNext()) { lastElement = itr.next(); } driver.switchTo().window(lastElement); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentPresent(java.lang.String, long) */ @Override public boolean isComponentPresent(String locator, long seconds) { try { WebDriverWait wait = new WebDriverWait(driver, seconds); wait.until(ExpectedConditions.presenceOfElementLocated(determineLocator(locator))); return true; } catch (Exception e) { return false; } } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentNotPresent(org.openqa.selenium.String) */ @Override public boolean isComponentNotPresent(String locator) { return driver.findElements(determineLocator(locator)).size() == 0; } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentVisible(org.openqa.selenium.String) */ @Override public boolean isComponentVisible(String locator) { return isComponentPresent(locator) && driver.findElement(determineLocator(locator)).isDisplayed(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentVisible(java.lang.String, long) */ @Override public boolean isComponentVisible(String locator, long seconds) { try { WebDriverWait wait = new WebDriverWait(driver, seconds); wait.until(ExpectedConditions.visibilityOfElementLocated(determineLocator(locator))); return true; } catch (TimeoutException e) { return false; } } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentNotVisible(org.openqa.selenium.String) */ @Override public boolean isComponentNotVisible(final String locator) { return !isComponentVisible(locator); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentNotVisible(java.lang.String, long) */ @Override public boolean isComponentNotVisible(String locator, long seconds) { try { WebDriverWait wait = new WebDriverWait(driver, seconds); wait.until(ExpectedConditions.invisibilityOfElementLocated(determineLocator(locator))); return true; } catch (TimeoutException e) { return false; } } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentSelected(org.openqa.selenium.String) */ @Override public boolean isComponentSelected(String locator) { return waitForElement(locator).isSelected(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * isComponentNotSelected(org.openqa.selenium.String) */ @Override public boolean isComponentNotSelected(String locator) { return !waitForElement(locator).isSelected(); } /** * Wait for alert. * * @return the alert */ public Alert waitForAlert() { WebDriverWait wait = new WebDriverWait(driver, SteviaContext.getWaitForElement()); return wait.until(ExpectedConditions.alertIsPresent()); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#clickOkInAlert * () */ public void clickOkInAlert() { waitForAlert().accept(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * clickCancelInAlert() */ public void clickCancelInAlert() { waitForAlert().dismiss(); } /** * Gets the full xpath. * * @param locator * the locator * @return the full xpath */ public String getFullXpath(String locator) { WebElement element = waitForElement(locator); String js = "gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]).toLowerCase()"; return "//" + executeJavascript(js, element); } /** * Gets the full xpath. * * @param element * the Webelement * @return the full xpath */ public String getFullXpath(WebElement element) { String js = "gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]).toLowerCase()"; return "//" + executeJavascript(js, element); } /** * Gets the table header position. * * @param locator * the locator * @param headerName * the header name * @return the table header position */ public String getTableHeaderPosition(String locator, String headerName) { List<WebElement> columnHeaders = null; WebElement element = waitForElement(locator); columnHeaders = element.findElements(By.cssSelector("th")); int position = 1; for (WebElement record : columnHeaders) { if (record.getText().equals(headerName)) { return String.valueOf(position); } position++; } throw new WebDriverException("Header name not Found"); } /* (non-Javadoc) * @see com.persado.oss.quality.stevia.selenium.core.WebController#getTableElementColumnPosition(java.lang.String, java.lang.String) */ @Override public String getTableElementColumnPosition(String locator, String elementName) { List<WebElement> tableRows = null; List<WebElement> tableColumnsPerRow = null; WebElement element = waitForElement(locator); tableRows = element.findElements(By.cssSelector("tbody tr")); int position = 1; for (WebElement row : tableRows) { tableColumnsPerRow = row.findElements(By.cssSelector("td")); for (WebElement column:tableColumnsPerRow){ if (column.getText().equals(elementName)) { return String.valueOf(position); } position++; } position = 1; } throw new WebDriverException("Column name not Found"); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getTableElementRowPosition(java.lang.String, java.lang.String) */ public String getTableElementRowPosition(String locator, String elementName) { List<WebElement> tableRows = null; List<WebElement> tableColumnsPerRow = null; WebElement element = waitForElement(locator); tableRows = element.findElements(By.cssSelector("tbody tr")); int position = 1; for (WebElement row : tableRows) { tableColumnsPerRow = row.findElements(By.cssSelector("td")); for (WebElement column : tableColumnsPerRow) { if (column.getText().equals(elementName)) { return String.valueOf(position); } } position++; } throw new WebDriverException("Element not Found"); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getTableElementTextForSpecificHeader(java.lang.String, java.lang.String, * java.lang.String) */ public String getTableElementTextUnderHeader(String locator, String elementName, String headerName) { WebElement element = waitForElement(locator); return element.findElement(By.cssSelector("tbody tr:nth-child(" + getTableElementRowPosition(locator, elementName) + ") td:nth-child(" + getTableHeaderPosition(locator, headerName) + ")")) .getText(); } /* (non-Javadoc) * @see com.persado.oss.quality.stevia.selenium.core.WebController#getTableRecordsUnderHeader(java.lang.String, java.lang.String) */ public List<String> getTableRecordsUnderHeader(String locator,String headerName) { List<String> records = new ArrayList<String>(); WebElement element = waitForElement(locator); String headerPosition = getTableHeaderPosition(locator,headerName); List<WebElement> rows = element.findElements(By.cssSelector("tbody tr")); for(WebElement row:rows){ records.add(row.findElement(By.cssSelector("th:nth-child("+ headerPosition + "),td:nth-child("+ headerPosition + ")")).getText()); } return records; } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getTableElementTextForRowAndColumn(java.lang.String, java.lang.String, * java.lang.String) */ @Override public String getTableElementTextForRowAndColumn(String locator, String row, String column) { WebElement element = waitForElement(locator); return element.findElement(By.cssSelector("tr:nth-child(" + row + ") td:nth-child(" + column + ")")).getText(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getTableElements2DArray(java.lang.String) */ @Override public String[][] getTableElements2DArray(String locator) { WebElement element = waitForElement(locator); List<WebElement> tableRows = element.findElements(By.cssSelector("tbody tr")); int numberOrRows = tableRows.size(); int numberOfColumns = element.findElements(By.cssSelector("tbody tr:nth-child(1) td")).size(); String[][] table = new String[numberOrRows][numberOfColumns]; for (int i = 0; i < numberOrRows; i++) { List<WebElement> tableColumnsPerRow = tableRows.get(i).findElements(By.cssSelector("td")); for (int j = 0; j < tableColumnsPerRow.size(); j++) { table[i][j] = tableColumnsPerRow.get(j).getText(); } } return table; } /* (non-Javadoc) * @see com.persado.oss.quality.stevia.selenium.core.WebController#getTableInfoAsList(java.lang.String) */ @Override public List<List<String>> getTableInfoAsList(String locator) { WebElement table = waitForElement(locator); List<List<String>> tableInfo = new ArrayList<List<String>>(); List<WebElement> tableRows = table.findElements(By.cssSelector("tbody tr")); for (WebElement row:tableRows){ List<String> rowText = new ArrayList<String>(); List<WebElement> columnsPerRow = row.findElements(By.cssSelector("td")); for(WebElement column:columnsPerRow){ rowText.add(column.getText()); } tableInfo.add(rowText); } return tableInfo; } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getTableElementSpecificHeaderLocator(java.lang.String, java.lang.String, * java.lang.String) */ @Override public String getTableElementSpecificHeaderLocator(String locator, String elementName, String headerName) { if (locator.startsWith(XPATH)) { return "//" + findLocatorSubstring(locator)+ "//tr[" + getTableElementRowPosition(locator, elementName) + "]//td[" + getTableHeaderPosition(locator, headerName) + "]"; } else if (locator.startsWith("//")) { return locator + "//tr[" + getTableElementRowPosition(locator, elementName) + "]//td[" + getTableHeaderPosition(locator, headerName) + "]"; } else if (locator.startsWith(CSS)) { return locator + " tr:nth-child(" + getTableElementRowPosition(locator, elementName) + ") td:nth-child(" + getTableHeaderPosition(locator, headerName) + ")"; } else { return "css=#" + locator + " tr:nth-child(" + getTableElementRowPosition(locator, elementName) + ") td:nth-child(" + getTableHeaderPosition(locator, headerName) + ")"; } } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getTableElementSpecificRowAndColumnLocator(java.lang.String, * java.lang.String, java.lang.String) */ @Override public String getTableElementSpecificRowAndColumnLocator(String locator, String row, String column) { if (locator.startsWith(XPATH)) { return "//" + findLocatorSubstring(locator) + "//tr[" + row + "]//td[" + column + "]"; } else if (locator.startsWith("//")) { return locator + "//tr[" + row + "]//td[" + column + "]"; } else if (locator.startsWith(CSS)) { return locator + " tr:nth-child(" + row + ") td:nth-child(" + column + ")"; } else { return "css=#" + locator + " tr:nth-child(" + row + ") td:nth-child(" + column + ")"; } } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#navigate * (java.lang.String) */ public void navigate(String url) { Assert.hasLength(url, "url should be configured"); driver.navigate().to(url); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getCurrentUrl * () */ public String getCurrentUrl() { return driver.getCurrentUrl(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#close() */ @Override public void close() { driver.close(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#quit() */ @Override public void quit() { driver.quit(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#pressLinkName * (java.lang.String) */ @Override public void pressLinkName(String linkName) { (new WebDriverWait(driver, SteviaContext.getWaitForElement())).until(ExpectedConditions.visibilityOfElementLocated((By.linkText(linkName)))).click(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressLinkNameAndWaitForPageToLoad(java.lang.String) */ @Override public void pressLinkNameAndWaitForPageToLoad(String linkName) { pressLinkName(linkName); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressLinkNameAndClickOkInAlert(java.lang.String) */ @Override public void pressLinkNameAndClickOkInAlert(String linkName) { pressLinkName(linkName); clickOkInAlert(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressLinkNameAndClickOkInAlertNoPageLoad(java.lang.String) */ @Override public void pressLinkNameAndClickOkInAlertNoPageLoad(String linkName) { pressLinkNameAndClickOkInAlert(linkName); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * pressLinkNameAndClickCancelInAlert(java.lang.String) */ @Override public void pressLinkNameAndClickCancelInAlert(String linkName) { pressLinkName(linkName); clickCancelInAlert(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * executeJavascript(java.lang.String, java.lang.Object[]) */ @Override public Object executeJavascript(String js, Object... args) { JavascriptExecutor executor = (JavascriptExecutor) driver; return executor.executeScript(js, args); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getAttributeValue(java.lang.String, java.lang.String) */ @Override public String getAttributeValue(String locator, String attribute) { return waitForElement(locator).getAttribute(attribute); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#dragAndDrop * (java.lang.String, java.lang.String) */ @Override public void dragAndDrop(String locatorFrom, String locatorTo) { getBuilder().dragAndDrop(waitForElement(locatorFrom), waitForElement(locatorTo)).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#dragAndDrop * (java.lang.String, int, int) */ @Override public void dragAndDrop(String locatorFrom, int xOffset, int yOffset) { getBuilder().dragAndDropBy(waitForElement(locatorFrom), xOffset, yOffset).perform(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * switchToNewWindow() */ @Override public void switchToLatestWindow() { Iterator<String> itr = driver.getWindowHandles().iterator(); String lastElement = null; while (itr.hasNext()) { lastElement = itr.next(); } driver.switchTo().window(lastElement); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getAllListOptions(java.lang.String) */ @Override public List<String> getAllListOptions(String locator) { List<String> optionValues = new ArrayList<String>(); Select menuList = getSelectObject(locator); List<WebElement> options = menuList.getOptions(); for (WebElement option : options) { optionValues.add(option.getText()); } return optionValues; } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#selectFrame * (java.lang.String) */ @Override public void selectFrame(String frameID) { selectFrameMain(); driver.switchTo().frame(frameID); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * selectFrameMain() */ @Override public void selectFrameMain() { driver.switchTo().defaultContent(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#maximizeWindow * () */ public void maximizeWindow() { driver.manage().window().maximize(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getNumberOfElementsMatchLocator(java.lang.String) */ @Override public int getNumberOfElementsMatchLocator(String locator) { return driver.findElements(determineLocator(locator)).size(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#moveToElement * (java.lang.String, int, int) */ @Override public void moveToElement(String locator, int x, int y) { getBuilder().moveToElement(waitForElement(locator), x, y).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#moveToElement * (java.lang.String) */ @Override public void moveToElement(String locator) { getBuilder().moveToElement(waitForElement(locator)).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#moveByOffset * (int, int) */ @Override public void moveByOffset(int xOffset, int yOffset) { getBuilder().moveByOffset(xOffset, yOffset).perform(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getAlertText * () */ @Override public String getAlertText() { return waitForAlert().getText(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * promptInputPressOK(java.lang.String) */ @Override public void promptInputPressOK(String inputMessage) { Alert alert = waitForAlert(); alert.sendKeys(inputMessage); alert.accept(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * promptInputPressCancel(java.lang.String) */ @Override public void promptInputPressCancel(String inputMessage) { Alert alert = waitForAlert(); alert.sendKeys(inputMessage); alert.dismiss(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * waitForAjaxComplete(long) */ @Override public void waitForAjaxComplete(long milliseconds) { long endTime; boolean ajaxComplete = false; long startTime = System.currentTimeMillis(); do { try { ajaxComplete = ((Boolean) executeJavascript("return jQuery.active == 0")).booleanValue(); Thread.sleep(THREAD_SLEEP); } catch (InterruptedException e) { error(e.getMessage()); } endTime = System.currentTimeMillis(); } while (!ajaxComplete && endTime - startTime <= milliseconds); if (!ajaxComplete) { warn("The AJAX call was not completed with in " + milliseconds + " ms"); } } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getElementPosition(java.lang.String) */ @Override public Point getElementPosition(String locator) { return waitForElement(locator).getLocation(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#refresh() */ @Override public void refresh() { driver.navigate().refresh(); } /* * (non-Javadoc) * * @see * com.persado.oss.quality.stevia.selenium.core.WebController#getRowsNumber * (java.lang.String) */ @Override public int getNumberOfTotalRows(String locator) { return waitForElement(locator).findElements(By.cssSelector("tbody tr")).size(); } /* * (non-Javadoc) * * @see com.persado.oss.quality.stevia.selenium.core.WebController# * getColumnsNumber(java.lang.String) */ @Override public int getNumberOfTotalColumns(String locator) { return waitForElement(locator).findElements(By.cssSelector("tbody tr:nth-child(1) td")).size(); } /* (non-Javadoc) * @see com.persado.oss.quality.stevia.selenium.core.WebController#getCookieByName(java.lang.String) */ @Override public HttpCookie getCookieByName(String name) { return new HttpCookie(name, driver.manage().getCookieNamed(name).getValue()); } /* (non-Javadoc) * @see com.persado.oss.quality.stevia.selenium.core.WebController#getAllCookies() */ @Override public List<HttpCookie> getAllCookies() { List<HttpCookie> allCookies = new ArrayList<HttpCookie>(); Iterator<Cookie> it = driver.manage().getCookies().iterator(); while(it.hasNext()){ Cookie c = it.next(); allCookies.add(new HttpCookie(c.getName(), c.getValue())); } return allCookies; } }