All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.noga.njexl.testing.ui.XSelenium Maven / Gradle / Ivy

Go to download

The Commons Jexl library is an implementation of the JSTL Expression Language with extensions. This was customized by nmondal.

The newest version!
/**
 * Copyright 2015 Nabarun Mondal
 * 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.noga.njexl.testing.ui;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.noga.njexl.lang.Interpreter;
import com.noga.njexl.lang.extension.TypeUtility;
import com.noga.njexl.lang.extension.dataaccess.DataMatrix;
import com.noga.njexl.testing.TestAssert;
import com.noga.njexl.testing.Utils;
import com.noga.njexl.testing.dataprovider.DataSource;
import com.noga.njexl.testing.dataprovider.ProviderFactory;
import com.thoughtworks.selenium.Selenium;
import com.noga.njexl.lang.extension.oop.ScriptClassBehaviour.Eventing;
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.Select;

import java.io.File;
import java.util.*;
import java.util.regex.Pattern;


/**
 * A Selenium RC style guy - using raw webdriver component,
 * No fancy stuff at all.
 * Final goal is to remove @{Selenium} and use XSelenium as the protocol
 * Created by noga on 24/02/15.
 */
public class XSelenium  implements Selenium, Eventing , TestAssert.AssertionEventListener {

    public static final String SELENIUM_VAR = "selenium" ;

    public static final String SELENIUM_NS = "sel" ;

    public static final String BASE_URL = "__URL__" ;

    public static final String OS_NAME = System.getProperty("os.name").toLowerCase();

    public static final boolean IS_MAC = OS_NAME.startsWith("mac ");

    public static final boolean IS_WIN = OS_NAME.startsWith("win");

    public static final String CHROME_DRIVER_PATH = "CHROME_DRIVER" ;

    public static final String OPERA_DRIVER_PATH = "OPERA_DRIVER" ;


    public static final int BLINK_TIMES = 3 ;

    public static final String BLINK_WIDTH = "3" ;

    public static final int BLINK_DELAY = 1000 ;

    public static final String BLINK_COLOR = "red" ;

    protected int typeDelay = 580 ;

    protected String baseUrl;

    public void typeDelay( int delay){
        if ( delay > 100 ) {
            typeDelay = delay;
        }
    }

    public int typeDelay( ){
        return typeDelay ;
    }

    /**
     * Do we want to clear field before typing?
     * Probably YES.
     */
    boolean __CLEAR_FIELD__ = true;

    public static final String[] xpathListButtons = {"//button", "//input[@type=\'submit\']",
            "//input[@type=\'button\']"};
    public static final String[] xpathListFields = {"//input[@type=\'text\']", "//input[@type=\'radio\']",
            "//input[@type=\'password\']", "//input[@type=\'submit\']", "//input[@type=\'button\']",
            "//input[@type=\'color\']", "//input[@type=\'date\']", "//input[@type=\'datetime\']",
            "//input[@type=\'datetime-local\']", "//input[@type=\'checkbox\']", "//input[@type=\'email\']",
            "//input[@type=\'hidden\']",
            "//input[@type=\'image\']", "//input[@type=\'email\']", "//input[@type=\'month\']",
            "//input[@type=\'number\']", "//input[@type=\'range\']", "//input[@type=\'search\']",
            "//input[@type=\'tel\']", "//input[@type=\'time\']", "//input[@type=\'url\']", "//input[@type=\'week\']",
            "//input[@type=\'file\']", "//input[@type=\'reset\']"};

    public static final String[] xpathListLinks = {"//a"};

    String screenShotDir = System.getProperty("user.dir") ;

    /**
     * Gets the directory of screen shots
     * @return the screen shot dir
     */
    public String screenShotDir(){
        return screenShotDir ;
    }

    /**
     * Sets the directory of screen shots
     * @param dir the directory of the screen shot
     * @return true if it was successful, false if not
     */
    public boolean screenShotDir(String dir){
        File file = new File(dir);
        if ( file.isDirectory() ) {
            screenShotDir = dir;
            return true ;
        }
        return false ;
    }

    String getScreenShotFile(){
        String tsFormatted = TypeUtility.castString( new Date(), "yyyy-MMM-dd-hh-mm-ss-ms" );
        String file = screenShotDir + "/" + tsFormatted + ".png" ;
        return file ;
    }

    @Override
    public void onAssertion(TestAssert.AssertionEvent assertionEvent) {
        boolean screenShot = ((TestAssert)assertionEvent.getSource()).hasError();
        if ( screenShot ){
            captureScreenshot(getScreenShotFile());
        }
    }

    int timeout = 30000; // 30 sec should be good

    /**
     * What is the time out for the wait operations
     * @return the time out in ms
     */
    public int timeout(){
        return timeout ;
    }

    /**
     * Sets the timeout, must be greater than 0
     * @param ms the time out in ms greater than  0
     */
    public void timeout(int ms){
        if ( ms > 0 ) {
            timeout = ms;
        }
    }

    int poll =  100 ; // 100 msec is fine

    /**
     * What is the polling time for the wait operations
     * @return the polling time in ms
     */
    public int poll() {
        return poll;
    }

    /**
     * Sets the polling time for the wait operations  must be greater than 0
     * @param poll the poll time in ms greater than  0
     */
    public void poll(int poll) {
        if ( poll >  0 ) {
            this.poll = poll;
        }
    }

    protected void waitForAppear(String locator){
        long start = System.currentTimeMillis() ;
        long now = start ;
        while( true ){
            boolean in = isElementPresent(locator) && isVisible(locator);
            if ( in ){
                System.out.printf("@@[%s]%d\n", locator,now-start);
                break;
            }
            now = System.currentTimeMillis();
            if ( now - start > timeout ){
                String message = String.format("Element (%s) is still absent!" , locator );
                throw new Error(message);
            }
            try{
                Thread.sleep(poll);
            }catch (Exception e){}
        }
    }

    protected void waitForDisappear(String locator){
        long start = System.currentTimeMillis() ;
        long now = start ;
        while( true ){
            boolean out = !isElementPresent(locator) || !isVisible(locator);
            if ( out ){
                System.out.printf("@@[%s]%d\n", locator,now-start);
                break;
            }
            now = System.currentTimeMillis();
            if ( now - start > timeout ){
                String message = String.format("Element (%s) is still present!" , locator );
                throw new Error(message);
            }
            try{
                Thread.sleep(poll);
            }catch (Exception e){}
        }
    }

    public static final String APPEAR = "@@" ;

    public static final String DISAPPEAR = "$$" ;

    int delay = 1000 ;

    public void setDelay(int ms){
        if ( ms > 10 ){
            delay = ms ;
        }
    }

    public void delay(int ms){
        try{
            Thread.sleep(ms);
        }catch (Exception e){
        }
    }

    @Override
    public void after(Event event) {
        if ( DISAPPEAR.equals(event.pattern) && event.args.length > 0 ){
            waitForDisappear(event.args[0].toString());
        }else{
            delay(delay);
        }
    }

    @Override
    public void before(Event event) {
        if ( APPEAR.equals(event.pattern) && event.args.length > 0 ){
            waitForAppear(event.args[0].toString());
        }else{
            delay(delay);
        }
    }

    /**
     * The Types of Browser we support, as of now
     */
    public enum BrowserType{
        FIREFOX,
        HTML_UNIT,
        IE,
        CHROME,
        OPERA,
        SAFARI
    }

    /**
     * Gets the XSelenium with
     * @param type the type of the browser
     * @return an @{WebDriver} object
     */
    public static WebDriver  local(BrowserType type){
        WebDriver driver = null;
        ChromeDriverService service = null;
        switch (type){
            case HTML_UNIT:
                //set javascript support : with chrome mode on
                driver = new HtmlUnitDriver(BrowserVersion.CHROME);
                ((HtmlUnitDriver)driver).setJavascriptEnabled(true);
                break;
            case CHROME:
                String chromeDriverBin = System.getenv(CHROME_DRIVER_PATH);
                try {
                    service = new ChromeDriverService.Builder()
                            .usingDriverExecutable(new File(chromeDriverBin))
                            .usingAnyFreePort()
                            .build();
                    service.start();
                }catch (Exception e){
                    System.err.println(e);
                    return null;
                }
                driver = new ChromeDriver(service,DesiredCapabilities.chrome());
                break;
            case OPERA:
                String operaDriverBin = System.getenv(OPERA_DRIVER_PATH);
                try {
                    service = new ChromeDriverService.Builder()
                            .usingDriverExecutable(new File(operaDriverBin))
                            .usingAnyFreePort()
                            .build();
                    service.start();
                }catch (Exception e){
                    System.err.println(e);
                    return null;
                }
                driver = new ChromeDriver(service, DesiredCapabilities.opera());
                break;

            case SAFARI:
                driver = new SafariDriver();
                break;
            case IE:
                driver = new InternetExplorerDriver();
                break;
            case FIREFOX:
            default:
                driver = new FirefoxDriver();
                break;
        }
        return driver ;
    }

    /**
     * Gets the remote XSelenium with
     * @param config the configuration file location of browserstack
     * @return an @{XSelenium} object
     */
    public static WebDriver remote(String config){
        BrowserStackDriver driver = new BrowserStackDriver(config);
        return driver ;
    }
    /**
     * Gets the XSelenium with
     * @param baseUrl the base url
     * @param browserType the type of the browser
     * @return an @{XSelenium} object
     */
    public static XSelenium  selenium(String baseUrl, BrowserType browserType) {
        WebDriver driver = local(browserType);
        return new XSelenium(driver,baseUrl);
    }

    /**
     * Gets the XSelenium with
     * @param baseUrl the base url
     * @param configFile the remote config file for the browser
     * @return an @{XSelenium} object
     */
    public static XSelenium  selenium(String baseUrl, String configFile) {
        WebDriver driver = remote(configFile);
        return new XSelenium(driver,baseUrl);
    }

    public XSelenium(WebDriver driver, String baseUrl) {
        this.driver = driver ;
        this.baseUrl = baseUrl ;
    }

    public static By getByFromLocator(String locator) {
        if (locator.startsWith("/")) {
            // This is xpath
            return (By.xpath(locator));
        }
        if (locator.startsWith("xpath=")) {
            String xpath = locator.substring(6);
            return (By.xpath(xpath));
        }
        if (locator.startsWith("class=")) {
            String cl = locator.substring(6);
            return (By.className(cl));
        }
        if (locator.startsWith("id=")) {
            String id = locator.substring(3);
            return (By.id(id));
        }
        if (locator.startsWith("link=")) {
            String linkText = locator.substring(5);
            return (By.partialLinkText(linkText));
        }
        if (locator.startsWith("name=")) {
            String name = locator.substring(5);
            return (By.name(name));
        }
        if (locator.startsWith("css=")) {
            String css = locator.substring(4);
            return (By.cssSelector(css));
        }
        if (locator.startsWith("tag=")) {
            String tag = locator.substring(4);
            return (By.tagName(tag));
        }
        // when nothing matches -take as id.
        return (By.id(locator));
    }

    public final WebDriver driver;

    public String getXPath(WebElement webElement) {
        String jscript = "function getPathTo(node) {" +
                "  var stack = [];" +
                "  while(node.parentNode !== null) {" +
                "    stack.unshift(node.tagName);" +
                "    node = node.parentNode;" +
                "  }" +
                "  return stack.join('/');" +
                "}" +
                "return getPathTo(arguments[0]);";
        return (String) ((JavascriptExecutor) driver).executeScript(jscript, webElement);
    }

    Select getSelect(String locator) {
        By by = getByFromLocator(locator);
        WebElement elem = driver.findElement(by);
        Select select = new Select(elem);
        return select;
    }

    public static class SelectOption {
        public enum Using {
            id,
            label,
            value,
            index
        }

        public Using using;
        public String item;

        public SelectOption(Using u, String item) {
            using = u;
            this.item = item;
        }

    }

    SelectOption getSelectOption(String optionLocator) {
        String item;
        if (optionLocator.startsWith("value=")) {
            item = optionLocator.substring("value=".length());
            return new SelectOption(SelectOption.Using.value, item);

        } else if (optionLocator.startsWith("id=")) {
            item = optionLocator.substring("id=".length());
            return new SelectOption(SelectOption.Using.id, item);


        } else if (optionLocator.startsWith("index=")) {
            item = optionLocator.substring("index=".length());
            return new SelectOption(SelectOption.Using.index, item);

        }
        item = optionLocator;
        if (optionLocator.startsWith("label=")) {
            item = optionLocator.substring("label=".length());
        }
        return new SelectOption(SelectOption.Using.label, item);
    }

    public void selectItem(Select select, String optionLocator) {
        SelectOption option = getSelectOption(optionLocator);
        switch (option.using) {
            case id:
                WebElement element = driver.findElement(getByFromLocator(optionLocator));
                if (!element.isSelected()) {
                    element.click();
                }
                break;
            case value:
                select.selectByValue(option.item);
                break;
            case index:
                select.selectByIndex(Integer.parseInt(option.item));
                break;
            case label:
                select.selectByVisibleText(option.item);
                break;
            default:
                break;
        }
    }

    public void deSelectItem(Select select, String optionLocator) {
        SelectOption option = getSelectOption(optionLocator);
        switch (option.using) {
            case id:
                WebElement element = driver.findElement(getByFromLocator(optionLocator));
                if (element.isSelected()) {
                    element.click();
                }
                break;
            case value:
                select.deselectByValue(option.item);
                break;
            case index:
                select.deselectByIndex(Integer.parseInt(option.item));
                break;
            case label:
                select.deselectByVisibleText(option.item);
                break;
            default:
                break;
        }
    }

    public WebElement element(String locator){
        By by = getByFromLocator(locator);
        return driver.findElement(by);
    }

    public List elements(String locator){
        By by = getByFromLocator(locator);
        return driver.findElements(by);
    }

    @Override
    public void click(String locator) {
        By by = getByFromLocator(locator);
        driver.findElement(by).click();
    }

    @Override
    public void doubleClick(String locator) {
        By by = getByFromLocator(locator);
        Actions action = new Actions(driver);
        action.moveToElement(driver.findElement(by)).doubleClick().build().perform();

    }


    @Override
    public void focus(String locator) {
        By by = getByFromLocator(locator);
        new Actions(driver).moveToElement(driver.findElement(by)).perform();
    }

    public String replaceSpecialCharacters(String value) {
        value = value.replaceAll("\\(", Keys.chord(Keys.SHIFT, "9"));
        value = value.replaceAll("&", Keys.chord(Keys.SHIFT, "7"));
        return value;
    }

    @Override
    public void type(String locator, String value) {
        By by = getByFromLocator(locator);
        WebElement element = driver.findElement(by);
        if (__CLEAR_FIELD__) {
            element.clear();
        }
        value = replaceSpecialCharacters(value);
        element.sendKeys(value);
    }

    @Override
    public void typeKeys(String locator, String value) {
        By by = getByFromLocator(locator);
        WebElement element = driver.findElement(by);
        value = replaceSpecialCharacters(value);
        for ( int i = 0 ; i < value.length();i++){
            element.sendKeys(Character.toString( value.charAt(i)));
            try{
                Thread.sleep(typeDelay);
            }catch (Exception e){
            }
        }
    }


    @Override
    public void check(String locator) {
        By by = getByFromLocator(locator);
        WebElement element = driver.findElement(by);
        if (!element.isSelected()) {
            element.click();
        }
    }

    @Override
    public void uncheck(String locator) {
        By by = getByFromLocator(locator);
        WebElement element = driver.findElement(by);
        if (element.isSelected()) {
            element.click();
        }
    }

    @Override
    public void select(String selectLocator, String optionLocator) {
        Select select = getSelect(selectLocator);
        if (select.isMultiple()) {
            select.deselectAll();
        }
        selectItem(select, optionLocator);
    }

    @Override
    public void addSelection(String locator, String optionLocator) {
        Select select = getSelect(locator);
        selectItem(select, optionLocator);
    }

    @Override
    public void removeSelection(String locator, String optionLocator) {
        Select select = getSelect(locator);
        deSelectItem(select, optionLocator);
    }

    @Override
    public void removeAllSelections(String locator) {
        Select select = getSelect(locator);
        select.deselectAll();
    }

    @Override
    public void submit(String formLocator) {
        By by = getByFromLocator(formLocator);
        driver.findElement(by).submit();
    }

    @Override
    public void mouseMove(String locator) {
        WebElement el = element(locator);
        Actions builder = new Actions(driver);
        builder.moveToElement(el).perform();
    }

    @Override
    public void deleteCookie(String name, String optionsString) {
        driver.manage().deleteCookieNamed(name);
    }

    @Override
    public String getCookie() {
        Set cookies = driver.manage().getCookies();
        StringBuffer buf = new StringBuffer();
        for ( Cookie c : cookies ){
            buf.append(c.toString()).append(";;;");
        }
        return buf.toString();
    }

    @Override
    public String getCookieByName(String name) {
       return driver.manage().getCookieNamed(name).toString();
    }

    @Override
    public void attachFile(String fieldLocator, String fileLocator) {
        type(fieldLocator, fileLocator);
    }

    @Override
    public void contextMenu(String locator) {
        Actions action= new Actions(driver);
        WebElement el = element(locator);
        action.contextClick(el).build().perform();
    }

    @Override
    public void dragAndDrop(String locator, String movementsString) {
        dragdrop(locator, movementsString);
    }

    @Override
    public void dragAndDropToObject(String locatorOfObjectToBeDragged, String locatorOfDragDestinationObject) {
        Actions actions = new Actions(driver);
        WebElement someElement = element(locatorOfObjectToBeDragged);
        WebElement otherElement = element(locatorOfDragDestinationObject);
        actions.dragAndDrop(someElement, otherElement).perform();
    }

    @Override
    public void dragdrop(String locator, String movementsString) {
        String[] cords = movementsString.split(",");
        Actions actions = new Actions(driver);
        int X = TypeUtility.castInteger(cords[0],0);
        int Y = TypeUtility.castInteger(cords[1], 0);
        WebElement someElement = element(locator);
        actions.dragAndDropBy(someElement, X, Y).perform();
    }

    @Override
    public void mouseOver(String locator) {
        Actions actions = new Actions(driver);
        WebElement someElement = element(locator);
        actions.moveToElement(someElement).perform();
    }

    @Override
    public void goBack() {
        driver.navigate().back();
    }

    @Override
    public void refresh() {
        driver.navigate().refresh();
    }

    @Override
    public void close() {
        driver.quit();
    }

    @Override
    public boolean isAlertPresent() {
        try {
            driver.switchTo().alert();
            return true;
        }   // try
        catch (NoAlertPresentException ex) {
            return false;
        } catch (Exception e) {
        }
        return false;
    }

    @Override
    public boolean isPromptPresent() {
        return isAlertPresent();
    }

    @Override
    public boolean isConfirmationPresent() {
        return isAlertPresent();
    }

    @Override
    public String getAlert() {
        try {
            return driver.switchTo().alert().getText();
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * Accepts the alert
     * @return true, if there was an alert to accept,
     *         false otherwise
     */
    public boolean acceptAlert(){
        if ( isAlertPresent() ){
            driver.switchTo().alert().accept();
            return true;
        }
        return false ;
    }

    /**
     * Dismisses an alert
     * @return true, if there was an alert to dismiss,
     *         false otherwise
     */
    public boolean dismissAlert(){
        if ( isAlertPresent() ){
            driver.switchTo().alert().dismiss();
            return true;
        }
        return false ;
    }

    /**
     * Accepts or Dismiss the alert
     * @param accept true to accept, false to dismiss if possible
     * @return true, if there was an alert to act on,
     *         false otherwise
     */
    public boolean alert(boolean accept){
        if ( accept ){ return  acceptAlert(); }
        return dismissAlert();
    }

    @Override
    public String getConfirmation() {
        return getAlert();
    }

    @Override
    public String getPrompt() {
        return getAlert();
    }

    @Override
    public String getLocation() {
        return driver.getCurrentUrl();
    }

    @Override
    public String getTitle() {
        return driver.getTitle();
    }

    @Override
    public String getBodyText() {
        String source = driver.getPageSource();
        String textOnly = Jsoup.parse(source).text();
        return textOnly;
    }

    @Override
    public String getValue(String locator) {
        By by = getByFromLocator(locator);
        WebElement element = driver.findElement(by);
        switch (element.getTagName()) {

            case "select" :
                return getSelectedValue(locator);
            case "input" :
                String type = element.getAttribute("type");
                if ( "checkbox".equals(type)){
                    return Boolean.toString(element.isSelected());
                }
                return element.getAttribute("value") ;
            default:
                return element.getText();
        }
    }

    @Override
    public String getText(String locator) {
        By by = getByFromLocator(locator);
        return driver.findElement(by).getText();
    }


    @Override
    public String getEval(String script) {
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        return executor.executeScript(script).toString();
    }

    @Override
    public boolean isChecked(String locator) {
        By by = getByFromLocator(locator);
        return driver.findElement(by).isSelected();
    }


    @Override
    public String[] getSelectedLabels(String selectLocator) {
        Select select = getSelect(selectLocator);
        List options = select.getAllSelectedOptions();
        String[] labels = new String[options.size()];
        for (int i = 0; i < labels.length; i++) {
            labels[i] = options.get(i).getText();
        }
        return labels;
    }

    @Override
    public String getSelectedLabel(String selectLocator) {
        Select select = getSelect(selectLocator);
        return select.getFirstSelectedOption().getText();
    }

    @Override
    public String[] getSelectedValues(String selectLocator) {
        Select select = getSelect(selectLocator);
        List options = select.getAllSelectedOptions();
        String[] values = new String[options.size()];
        for (int i = 0; i < values.length; i++) {
            values[i] = options.get(i).getAttribute("value");
        }
        return values;
    }

    @Override
    public String getSelectedValue(String selectLocator) {
        Select select = getSelect(selectLocator);
        return select.getFirstSelectedOption().getAttribute("value");
    }

    @Override
    public String[] getSelectedIndexes(String selectLocator) {
        Select select = getSelect(selectLocator);
        List selected = select.getAllSelectedOptions();
        List options = select.getOptions();
        String[] indices = new String[selected.size()];
        int j = 0;
        for (int i = 0; i < options.size(); i++) {
            String value = options.get(i).getAttribute("value");
            String sel = selected.get(j).getAttribute("value");
            if (value.equals(sel)) {
                indices[j] = Integer.toString(i);
                j++;
            }
        }
        return indices;
    }

    @Override
    public String getSelectedIndex(String selectLocator) {
        String[] indices = getSelectedIndexes(selectLocator);
        if (indices.length > 0) {
            return indices[0];
        }
        return null;
    }

    @Override
    public String[] getSelectedIds(String selectLocator) {
        Select select = getSelect(selectLocator);
        List options = select.getOptions();
        String[] ids = new String[options.size()];
        for (int i = 0; i < options.size(); i++) {
            ids[i] = options.get(i).getAttribute("id");
        }
        return ids;
    }

    @Override
    public String getSelectedId(String selectLocator) {
        String[] ids = getSelectedIds(selectLocator);
        if (ids.length > 1) {
            return ids[0];
        }
        return null;
    }

    @Override
    public boolean isSomethingSelected(String selectLocator) {
        Select select = getSelect(selectLocator);
        return select.getFirstSelectedOption() != null;
    }

    @Override
    public String[] getSelectOptions(String selectLocator) {
        Select select = getSelect(selectLocator);
        List options = select.getOptions();
        String[] labels = new String[options.size()];
        for (int i = 0; i < options.size(); i++) {
            labels[i] = options.get(i).getText();
        }
        return labels;
    }

    @Override
    public String getAttribute(String attributeLocator) {
        int i = attributeLocator.lastIndexOf('@');
        String locator = attributeLocator.substring(0, i);
        String attribute = attributeLocator.substring(i + 1);
        By by = getByFromLocator(locator);
        return driver.findElement(by).getAttribute(attribute);
    }

    @Override
    public boolean isTextPresent(String pattern) {
        Pattern p = Pattern.compile(pattern, Pattern.DOTALL | Pattern.MULTILINE);
        String text = getBodyText();
        return p.matcher(text).find();
    }

    @Override
    public boolean isElementPresent(String locator) {
        try {
            By by = getByFromLocator(locator);
            driver.findElement(by);
            return true;
        } catch (Exception e) {

        }
        return false;
    }

    @Override
    public boolean isVisible(String locator) {
        WebElement element = element(locator);
        return element.isDisplayed();
    }

    @Override
    public boolean isEditable(String locator) {
        WebElement element = element(locator);
        return element.isEnabled();
    }

    @Override
    public String getHtmlSource() {
        return driver.getPageSource();
    }

    @Override
    public Number getCssCount(String css) {
        return driver.findElements(By.cssSelector(css)).size();
    }

    @Override
    public Number getXpathCount(String xpath) {
        return driver.findElements(By.xpath(xpath)).size();
    }

    public String[] idByXpath(String[] xpathList) {
        List elements = new ArrayList();
        for (int i = 0; i < xpathList.length; i++)
            elements.addAll(driver.findElements(By.xpath(xpathList[i])));
        String[] listOfId = new String[elements.size()];
        for (int i = 0; i < listOfId.length; i++) {
            if (elements.get(i).getAttribute("id") == null) {
                //populate listOfId[i] with xpath for elements.get(i)
                try {
                    listOfId[i] = getXPath(elements.get(i));
                } catch (Exception e) {
                }
            } else {
                listOfId[i] = elements.get(i).getAttribute("id");
            }
        }
        return listOfId;
    }

    @Override
    public String[] getAllButtons() {
        return idByXpath(xpathListButtons);
    }

    @Override
    public String[] getAllFields() {
        return idByXpath(xpathListFields);
    }

    @Override
    public String[] getAllLinks() {
        return idByXpath(xpathListLinks);
    }

    @Override
    public String[] getAllWindowTitles() {
        String current = driver.getWindowHandle();
        String[] titleList;
        int i = -1;
        Set handles = driver.getWindowHandles();
        titleList = new String[handles.size()];
        for (String handle : handles) {
            driver.switchTo().window(handle);
            titleList[++i] = driver.getTitle();
        }
        driver.switchTo().window(current);
        return titleList;
    }

    public String[] getAllWindowSpecs(String attribute) {
        String current = driver.getWindowHandle();
        int i = -1;
        Set handles = driver.getWindowHandles();
        String[] specsList = new String[handles.size()];
        try {
            for (String handle : handles) {
                List e = driver.findElements(By.xpath("//meta"));
                for (WebElement element : e) {
                    if (element.getAttribute(attribute) == null) continue;
                    specsList[++i] = element.getAttribute(attribute);
                    break;
                }
                driver.switchTo().window(handle);
            }
            driver.switchTo().window(current);
        } catch (Exception e) {
            System.err.println("Exception found in switching windows: " + e);
        }
        return specsList;
    }

    @Override
    public String[] getAllWindowIds() {
        return getAllWindowSpecs("id");
    }

    @Override
    public String[] getAllWindowNames() {
        return getAllWindowSpecs("name");
    }

    @Override
    public Number getElementHeight(String locator) {
        By by = getByFromLocator(locator);
        return driver.findElement(by).getSize().getHeight();
    }

    @Override
    public Number getElementWidth(String locator) {
        By by = getByFromLocator(locator);
        return driver.findElement(by).getSize().getWidth();
    }

    @Override
    public Number getElementPositionLeft(String locator) {
        By by = getByFromLocator(locator);
        return driver.findElement(by).getLocation().getX();
    }

    @Override
    public Number getElementPositionTop(String locator) {
        By by = getByFromLocator(locator);
        return driver.findElement(by).getLocation().getY();
    }

    /**
     * Executes JavaScript from script synchronously
     * @param script a file location or a string
     * @param args attached arguments
     * @return the marshall-ed javascript object
     * @throws Exception in case of error
     */
    public Object js(String script,Object... args) throws Exception {
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        File file =  new File(script);
        if ( file.exists() ){
            script = Utils.readToEnd(script);
        }
        return executor.executeScript(script, args);
    }

    /**
     * Executes JavaScript from script asynchronously
     * @param script a string
     * @param args attached arguments
     * @return the marshall-ed javascript object
     */
    public Object jsa(String script,Object... args){
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        return executor.executeAsyncScript(script, args);
    }

    @Override
    public void captureEntirePageScreenshot(String filename, String kwargs) {
        this.captureScreenshot(filename);
    }

    /**
     * Selects a frame by frame index
     * @param inx 0 based index
     */
    public void frame(int inx){
        driver.switchTo().frame(inx);
    }

    /**
     * Selects a frame by frame name Or Id
     * @param nameOrId name or id
     */
    public void frame(String nameOrId){
        driver.switchTo().frame(nameOrId);
    }
    @Override
    public void selectFrame(String locator) {
        Integer inx = TypeUtility.castInteger(locator);
        if (  inx != null ){
            driver.switchTo().frame(inx);
        }else {
            WebElement frame = element(locator);
            driver.switchTo().frame(frame);
        }
    }

    @Override
    public void selectPopUp(String windowID) {
        selectWindow(windowID);
    }

    @Override
    public void selectWindow(String windowID) {
        driver.switchTo().window(windowID);
    }

    @Override
    public void windowMaximize() {
        driver.manage().window().maximize();
    }

    @Override
    public void runScript(String script) {
        try {
            js(script);
        }catch (Exception e){
            System.err.println("Error in runScript : " + e);
        }
    }

    @Override
    public String captureEntirePageScreenshotToString(String kwargs) {
       return ((TakesScreenshot)driver).getScreenshotAs(OutputType.BASE64);
    }

    @Override
    public void mouseDown(String locator) {
        Actions actions = new Actions(driver);
        WebElement element = element(locator);
        actions.clickAndHold(element);
    }


    @Override
    public void mouseUp(String locator) {
        Actions actions = new Actions(driver);
        WebElement element = element(locator);
        actions.release(element);
    }

    @Override
    public void keyPress(String locator, String keySequence) {
        Actions actions = new Actions(driver);
        WebElement element = element(locator);
        actions.sendKeys(element, keySequence);
    }

    @Override
    public void captureScreenshot(String filename) {
        try {
            File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
            FileUtils.copyFile(scrFile, new File(filename));
        }catch (Exception e){
            System.err.printf("Error Taking Screenshot : %s", e);
        }
    }

    public void highlight(String locator, Interpreter.NamedArgs... args){
        WebElement element = element(locator);
        highlight(element,args);
    }

    public void highlight(WebElement element, Interpreter.NamedArgs... args) {

        String lineWidth = BLINK_WIDTH ;
        String color = BLINK_COLOR ;
        int times = BLINK_TIMES ;
        int delay = BLINK_DELAY ;

        for ( int i = 0 ; ievent" handler.
     *
     * @param locator   an element locator
     * @param eventName the event name, e.g. "focus" or "blur"
     */
    @Override
    public void fireEvent(String locator, String eventName) {
        WebElement element = element(locator);
        String script = String.format("return arguments[0].%s() ; ", eventName );
                ((JavascriptExecutor) driver).executeScript(script, element);
    }

    /**
     * Press the shift key and hold it down until doShiftUp() is called or a new page is loaded.
     */
    @Override
    public void shiftKeyDown() {
        System.err.println("Sorry, no support for firing event!");
    }

    /**
     * Release the shift key.
     */
    @Override
    public void shiftKeyUp() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Press the meta key and hold it down until doMetaUp() is called or a new page is loaded.
     */
    @Override
    public void metaKeyDown() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Release the meta key.
     */
    @Override
    public void metaKeyUp() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Press the alt key and hold it down until doAltUp() is called or a new page is loaded.
     */
    @Override
    public void altKeyDown() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Release the alt key.
     */
    @Override
    public void altKeyUp() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Press the control key and hold it down until doControlUp() is called or a new page is loaded.
     */
    @Override
    public void controlKeyDown() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Release the control key.
     */
    @Override
    public void controlKeyUp() {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user pressing a key (without releasing it yet).
     *
     * @param locator     an element locator
     * @param keySequence Either be a string(
     *                    "\" followed by the numeric keycode  of the key to be pressed, normally the ASCII value of that key), or a single  character. For example: "
     */
    @Override
    public void keyDown(String locator, String keySequence) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user releasing a key.
     *
     * @param locator     an element locator
     * @param keySequence Either be a string(
     *                    "\" followed by the numeric keycode  of the key to be pressed, normally the ASCII value of that key), or a single  character. For example: "
     */
    @Override
    public void keyUp(String locator, String keySequence) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user moving the mouse pointer away from the specified element.
     *
     * @param locator an element locator
     */
    @Override
    public void mouseOut(String locator) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user pressing the right mouse button (without releasing it yet) on the specified
     * element.
     *
     * @param locator an element locator
     */
    @Override
    public void mouseDownRight(String locator) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user pressing the left mouse button (without releasing it yet) at the specified
     * location.
     *
     * @param locator     an element locator
     * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse event relative to the
     */
    @Override
    public void mouseDownAt(String locator, String coordString) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user pressing the right mouse button (without releasing it yet) at the specified
     * location.
     *
     * @param locator     an element locator
     * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse event relative to the
     */
    @Override
    public void mouseDownRightAt(String locator, String coordString) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates the event that occurs when the user releases the right mouse button (i.e., stops
     * holding the button down) on the specified element.
     *
     * @param locator an element locator
     */
    @Override
    public void mouseUpRight(String locator) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates the event that occurs when the user releases the mouse button (i.e., stops holding
     * the button down) at the specified location.
     *
     * @param locator     an element locator
     * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse event relative to the
     */
    @Override
    public void mouseUpAt(String locator, String coordString) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates the event that occurs when the user releases the right mouse button (i.e., stops
     * holding the button down) at the specified location.
     *
     * @param locator     an element locator
     * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse event relative to the
     */
    @Override
    public void mouseUpRightAt(String locator, String coordString) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Simulates a user pressing the mouse button (without releasing it yet) on the specified element.
     *
     * @param locator     an element locator
     * @param coordString specifies the x,y position (i.e. - 10,20) of the mouse event relative to the
     */
    @Override
    public void mouseMoveAt(String locator, String coordString) {
        System.err.println("Sorry, no support for keys events!");
    }

    /**
     * Set execution speed (i.e., set the millisecond length of a delay which will follow each
     * selenium operation). By default, there is no such delay, i.e., the delay is 0 milliseconds.
     *
     * @param value the number of milliseconds to pause after operation
     */
    @Override
    public void setSpeed(String value) {
        System.err.println("Sorry, no support for Speed!");
    }

    /**
     * Get execution speed (i.e., get the millisecond length of the delay following each selenium
     * operation). By default, there is no such delay, i.e., the delay is 0 milliseconds.
     * 

* See also setSpeed. * * @return the execution speed in milliseconds. */ @Override public String getSpeed() { System.err.println("Sorry, no support for Speed! I would return empty!"); return ""; } /** * Get RC logs associated with this session. * * @return the remote control logs associated with this session */ @Override public String getLog() { System.err.println("Sorry, no support for logs! I would return empty!"); return ""; } /** * Opens an URL in the test frame. This accepts both relative and absolute URLs. *

* The "open" command waits for the page to load before proceeding, ie. the "AndWait" suffix is * implicit. *

* Note: The URL must be on the same domain as the runner HTML due to security * restrictions in the browser (Same Origin Policy). If you need to open an URL on another domain, * use the Selenium Server to start a new browser session on that domain. * * @param url the URL to open; may be relative or absolute * @param ignoreResponseCode if set to true, ignores http response code. */ @Override public void open(String url, String ignoreResponseCode) { System.err.println("Sorry, no support for ignoring anything, I would do it normally!"); open(url); } /** * Opens an URL in the test frame. This accepts both relative and absolute URLs. *

* The "open" command waits for the page to load before proceeding, ie. the "AndWait" suffix is * implicit. *

* Note: The URL must be on the same domain as the runner HTML due to security * restrictions in the browser (Same Origin Policy). If you need to open an URL on another domain, * use the Selenium Server to start a new browser session on that domain. * * @param url the URL to open; may be relative or absolute */ @Override public void open(String url) { if ( url.toLowerCase().startsWith("http")){ driver.get(url); } else { driver.get(baseUrl + url); } } /** * Opens a popup window (if a window with that ID isn't already open). After opening the window, * you'll need to select it using the selectWindow command. *

* This command can also be a useful workaround for bug SEL-339. In some cases, Selenium will be * unable to intercept a call to window.open (if the call occurs during or before the "onLoad" * event, for example). In those cases, you can force Selenium to notice the open window's name by * using the Selenium openWindow command, using an empty (blank) url, like this: openWindow("", * "myFunnyWindow"). *

* * @param url the URL to open, which can be blank * @param windowID the JavaScript window ID of the window to select */ @Override public void openWindow(String url, String windowID) { System.err.println("Sorry, no support for popping windows now!"); } /** * Selects the main window. Functionally equivalent to using selectWindow() and * specifying no value for windowID. */ @Override public void deselectPopUp() { driver.switchTo().defaultContent(); } /** * Determine whether current/locator identify the frame containing this running code. *

* This is useful in proxy injection mode, where this code runs in every browser frame and window, * and sometimes the selenium server needs to identify the "current" frame. In this case, when the * test calls selectFrame, this routine is called for each frame to figure out which one has been * selected. The selected frame will return true, while all others will return false. *

* * @param currentFrameString starting frame * @param target new frame (which might be relative to the current one) * @return true if the new frame is this code's window */ @Override public boolean getWhetherThisFrameMatchFrameExpression(String currentFrameString, String target) { System.err.println("Sorry, no idea what this even means!"); return false; } /** * Determine whether currentWindowString plus target identify the window containing this running * code. *

* This is useful in proxy injection mode, where this code runs in every browser frame and window, * and sometimes the selenium server needs to identify the "current" window. In this case, when * the test calls selectWindow, this routine is called for each window to figure out which one has * been selected. The selected window will return true, while all others will return false. *

* * @param currentWindowString starting window * @param target new window (which might be relative to the current one, e.g., "_parent") * @return true if the new window is this code's window */ @Override public boolean getWhetherThisWindowMatchWindowExpression(String currentWindowString, String target) { return false; } /** * Waits for a popup window to appear and load up. * * @param windowID the JavaScript window "name" of the window that will appear (not the text of * the title bar) If unspecified, or specified as "null", this command will wait for the * first non-top window to appear (don't rely on this if you are working with multiple * popups simultaneously). * @param timeout a timeout in milliseconds, after which the action will return with an error. If * this value is not specified, the default Selenium timeout will be used. See the */ @Override public void waitForPopUp(String windowID, String timeout) { System.err.println("Sorry, no support for popping windows now!"); } /** *

* By default, Selenium's overridden window.confirm() function will return true, as if the user * had manually clicked OK; after running this command, the next call to confirm() will return * false, as if the user had clicked Cancel. Selenium will then resume using the default behavior * for future confirmations, automatically returning true (OK) unless/until you explicitly call * this command for each confirmation. *

*

* Take note - every time a confirmation comes up, you must consume it with a corresponding * getConfirmation, or else the next selenium operation will fail. *

*/ @Override public void chooseCancelOnNextConfirmation() { System.err.println("Sorry, no support for this sort of alerting"); } /** *

* Undo the effect of calling chooseCancelOnNextConfirmation. Note that Selenium's overridden * window.confirm() function will normally automatically return true, as if the user had manually * clicked OK, so you shouldn't need to use this command unless for some reason you need to change * your mind prior to the next confirmation. After any confirmation, Selenium will resume using * the default behavior for future confirmations, automatically returning true (OK) unless/until * you explicitly call chooseCancelOnNextConfirmation for each confirmation. *

*

* Take note - every time a confirmation comes up, you must consume it with a corresponding * getConfirmation, or else the next selenium operation will fail. *

*/ @Override public void chooseOkOnNextConfirmation() { System.err.println("Sorry, no support for this sort of alerting"); } /** * Instructs Selenium to return the specified answer string in response to the next JavaScript * prompt [window.prompt()]. * * @param answer the answer to give in response to the prompt pop-up */ @Override public void answerOnNextPrompt(String answer) { System.err.println("Sorry, no support for this sort of alerting"); } /** * Gets the text from a cell of a table. The cellAddress syntax tableLocator.row.column, where row * and column start at 0. * * @param tableCellAddress a cell address, e.g. "foo.1.4" * @return the text from the specified cell */ @Override public String getTable(String tableCellAddress) { System.err.println("Sorry, no support for this sort of slow table access, use table() instead"); return ""; } /** * Returns every instance of some attribute from all known windows. * * @param attributeName name of an attribute on the windows * @return the set of values of this attribute from all known windows. */ @Override public String[] getAttributeFromAllWindows(String attributeName) { System.err.println("Sorry, no support for this sort of attribute get"); return new String[0]; } /** * Configure the number of pixels between "mousemove" events during dragAndDrop commands * (default=10). *

* Setting this value to 0 means that we'll send a "mousemove" event to every single pixel in * between the start location and the end location; that can be very slow, and may cause some * browsers to force the JavaScript to timeout. *

*

* If the mouse speed is greater than the distance between the two dragged objects, we'll just * send one "mousemove" at the start location and then one final one at the end location. *

* * @param pixels the number of pixels between "mousemove" events */ @Override public void setMouseSpeed(String pixels) { System.err.println("Sorry, no support for playing with mouse speed"); } /** * Returns the number of pixels between "mousemove" events during dragAndDrop commands * (default=10). * * @return the number of pixels between "mousemove" events during dragAndDrop commands * (default=10) */ @Override public Number getMouseSpeed() { System.err.println("Sorry, no support for playing with mouse speed"); return -1; } /** * Gives focus to the currently selected window */ @Override public void windowFocus() { driver.switchTo().defaultContent(); } /** * Moves the text cursor to the specified position in the given input element or textarea. This * method will fail if the specified element isn't an input element or textarea. * * @param locator an element locator pointing to an input element or * textarea * @param position the numerical position of the cursor in the field; position should be 0 to move * the position to the beginning of the field. You can also set the cursor to -1 to move it */ @Override public void setCursorPosition(String locator, String position) { System.err.println("Sorry, no support for playing with cursor as of now"); } /** * Get the relative index of an element to its parent (starting from 0). The comment node and * empty text node will be ignored. * * @param locator an element locator pointing to an element * @return of relative index of the element to its parent (starting from 0) */ @Override public Number getElementIndex(String locator) { System.err.println("Sorry, no support for playing with position of child as of now"); return -1; } /** * Check if these two elements have same parent and are ordered siblings in the DOM. Two same * elements will not be considered ordered. * * @param locator1 an element locator pointing to the first element * @param locator2 an element locator pointing to the second element * @return true if element1 is the previous sibling of element2, false otherwise */ @Override public boolean isOrdered(String locator1, String locator2) { System.err.println("Sorry, no support for this, now!"); return false; } /** * Retrieves the text cursor position in the given input element or textarea; beware, this may not * work perfectly on all browsers. *

* Specifically, if the cursor/selection has been cleared by JavaScript, this command will tend to * return the position of the last location of the cursor, even though the cursor is now gone from * the page. This is filed as SEL-243. *

* This method will fail if the specified element isn't an input element or textarea, or there is * no cursor in the element. * * @param locator an element locator pointing to an input element or * textarea * @return the numerical position of the cursor in the field */ @Override public Number getCursorPosition(String locator) { System.err.println("Sorry, no support for playing with cursor position"); return -1; } /** * Returns the specified expression. *

* This is useful because of JavaScript preprocessing. It is used to generate commands like * assertExpression and waitForExpression. *

* * @param expression the value to return * @return the value passed in */ @Override public String getExpression(String expression) { Object o = ((JavascriptExecutor)driver).executeScript(expression); return String.format("%s",o); } /** * Temporarily sets the "id" attribute of the specified element, so you can locate it in the * future using its ID rather than a slow/complicated XPath. This ID will disappear once the page * is reloaded. * * @param locator an element locator pointing to an element * @param identifier a string to be used as the ID of the specified element */ @Override public void assignId(String locator, String identifier) { WebElement element = element(locator); String script = String.format("return arguments[0].setAttribute('id', '%s');", identifier); ((JavascriptExecutor)driver).executeScript(script, element); } /** * Specifies whether Selenium should use the native in-browser implementation of XPath (if any * native version is available); if you pass "false" to this function, we will always use our * pure-JavaScript xpath library. Using the pure-JS xpath library can improve the consistency of * xpath element locators between different browser vendors, but the pure-JS version is much * slower than the native implementations. * * @param allow boolean, true means we'll prefer to use native XPath; false means we'll only use * JS XPath */ @Override public void allowNativeXpath(String allow) { System.err.println("Sorry, no support for playing with XPath either!"); } /** * Specifies whether Selenium will ignore xpath attributes that have no value, i.e. are the empty * string, when using the non-native xpath evaluation engine. You'd want to do this for * performance reasons in IE. However, this could break certain xpaths, for example an xpath that * looks for an attribute whose value is NOT the empty string. *

* The hope is that such xpaths are relatively rare, but the user should have the option of using * them. Note that this only influences xpath evaluation when using the ajaxslt engine (i.e. not * "javascript-xpath"). * * @param ignore boolean, true means we'll ignore attributes without value at the expense of xpath * "correctness"; false means we'll sacrifice speed for correctness. */ @Override public void ignoreAttributesWithoutValue(String ignore) { System.err.println("Sorry, no support for playing with fire"); } /** * Runs the specified JavaScript snippet repeatedly until it evaluates to "true". The snippet may * have multiple lines, but only the result of the last line will be considered. *

* Note that, by default, the snippet will be run in the runner's test window, not in the window * of your application. To get the window of your application, you can use the JavaScript snippet * selenium.browserbot.getCurrentWindow(), and then run your JavaScript in there *

* * @param script the JavaScript snippet to run * @param timeout a timeout in milliseconds, after which this command will return with an error */ @Override public void waitForCondition(String script, String timeout) { System.err.println("Sorry, no support for playing with ideas of polling, not now, pls!"); } /** * Specifies the amount of time that Selenium will wait for actions to complete. *

* Actions that require waiting include "open" and the "waitFor*" actions. *

* The default timeout is 30 seconds. * * @param timeout a timeout in milliseconds, after which the action will return with an error */ @Override public void setTimeout(String timeout) { this.timeout = TypeUtility.castInteger( timeout, this.timeout ); } /** * Waits for a new page to load. *

* You can use this command instead of the "AndWait" suffixes, "clickAndWait", "selectAndWait", * "typeAndWait" etc. (which are only available in the JS API). *

*

* Selenium constantly keeps track of new pages loading, and sets a "newPageLoaded" flag when it * first notices a page load. Running any other Selenium command after turns the flag to false. * Hence, if you want to wait for a page to load, you must wait immediately after a Selenium * command that caused a page-load. *

* * @param timeout a timeout in milliseconds, after which this command will return with an error */ @Override public void waitForPageToLoad(String timeout) { this.timeout = TypeUtility.castInteger( timeout, this.timeout ); } /** * Waits for a new frame to load. *

* Selenium constantly keeps track of new pages and frames loading, and sets a "newPageLoaded" * flag when it first notices a page load. *

*

* See waitForPageToLoad for more information. * * @param frameAddress FrameAddress from the server side * @param timeout a timeout in milliseconds, after which this command will return with an error */ @Override public void waitForFrameToLoad(String frameAddress, String timeout) { System.err.println("Sorry, no support for playing with speed of frame load, no no no!"); } /** * Returns true if a cookie with the specified name is present, or false otherwise. * * @param name the name of the cookie * @return true if a cookie with the specified name is present, or false otherwise. */ @Override public boolean isCookiePresent(String name) { Set cookies = driver.manage().getCookies(); for ( Cookie c : cookies ){ if ( c.getName().equals(name)){ return true ; } } return false ; } /** * Create a new cookie whose path and domain are same with those of current page under test, * unless you specified a path for this cookie explicitly. * * @param nameValuePair name and value of the cookie in a format "name=value" * @param optionsString options for the cookie. Currently supported options include 'path', * 'max_age' and 'domain'. the optionsString's format is * "path=/path/, max_age=60, domain=.foo.com". The order of options are irrelevant, the * unit of the value of 'max_age' is second. Note that specifying a domain that isn't a */ @Override public void createCookie(String nameValuePair, String optionsString) { String[] pair = nameValuePair.split("="); Cookie cookie = new Cookie(pair[0],pair[1]); // TODO : option string later... dude... driver.manage().addCookie(cookie); } /** * Calls deleteCookie with recurse=true on all cookies visible to the current page. As noted on * the documentation for deleteCookie, recurse=true can be much slower than simply deleting the * cookies using a known domain/path. */ @Override public void deleteAllVisibleCookies() { driver.manage().deleteAllCookies(); } /** * Sets the threshold for browser-side logging messages; log messages beneath this threshold will * be discarded. Valid logLevel strings are: "debug", "info", "warn", "error" or "off". To see the * browser logs, you need to either show the log window in GUI mode, or enable browser-side * logging in Selenium RC. * * @param logLevel one of the following: "debug", "info", "warn", "error" or "off" */ @Override public void setBrowserLogLevel(String logLevel) { System.err.println("Sorry, no support for playing with browser logs"); } /** * Defines a new function for Selenium to locate elements on the page. For example, if you define * the strategy "foo", and someone runs click("foo=blah"), we'll run your function, passing you * the string "blah", and click on the element that your function returns, or throw an * "Element not found" error if your function returns null. *

* We'll pass three arguments to your function: *

    *
  • locator: the string the user passed in
  • *
  • inWindow: the currently selected window
  • *
  • inDocument: the currently selected document
  • *
* The function must return null if the element can't be found. * * @param strategyName the name of the strategy to define; this should use only letters [a-zA-Z] * with no spaces or other punctuation. * @param functionDefinition a string defining the body of a function in JavaScript. For example: */ @Override public void addLocationStrategy(String strategyName, String functionDefinition) { System.err.println("Sorry, no support for playing with locators"); } /** * Executes a command rollup, which is a series of commands with a unique name, and optionally * arguments that control the generation of the set of commands. If any one of the rolled-up * commands fails, the rollup is considered to have failed. Rollups may also contain nested * rollups. * * @param rollupName the name of the rollup command * @param kwargs keyword arguments string that influences how the rollup expands into commands */ @Override public void rollup(String rollupName, String kwargs) { System.err.println("Sorry, I do not think anyone ever used it!"); } /** * Loads script content into a new script tag in the Selenium document. This differs from the * runScript command in that runScript adds the script tag to the document of the AUT, not the * Selenium document. The following entities in the script content are replaced by the characters * they represent: *

* < > & *

* The corresponding remove command is removeScript. * * @param scriptContent the Javascript content of the script to add * @param scriptTagId (optional) the id of the new script tag. If specified, and an element with */ @Override public void addScript(String scriptContent, String scriptTagId) { System.err.println("Sorry, no support for playing with JS like this!"); } /** * Removes a script tag from the Selenium document identified by the given id. Does nothing if the * referenced tag doesn't exist. * * @param scriptTagId the id of the script element to remove. */ @Override public void removeScript(String scriptTagId) { System.err.println("Sorry, no support for playing with JS like this!"); } /** * Allows choice of one of the available libraries. * * @param libraryName name of the desired library Only the following three can be chosen: *

    *
  • "ajaxslt" - Google's library
  • *
  • "javascript-xpath" - Cybozu Labs' faster library
  • *
  • "default" - The default library. Currently the default library is "ajaxslt" .
  • *
* If libraryName isn't one of these three, then no change will be made. */ @Override public void useXpathLibrary(String libraryName) { System.err.println("Sorry, no support for playing with XPath like this"); } /** * Writes a message to the status bar and adds a note to the browser-side log. * * @param context the message to be sent to the browser */ @Override public void setContext(String context) { System.err.println("Sorry, no support for things as such : we are not hackers!"); } /** * Capture a PNG screenshot. It then returns the file as a base 64 encoded string. * * @return The base 64 encoded string of the screen shot (PNG file) */ @Override public String captureScreenshotToString() { String ss = ((TakesScreenshot)driver).getScreenshotAs(OutputType.BASE64); return ss; } /** * Returns the network traffic seen by the browser, including headers, AJAX requests, status * codes, and timings. When this function is called, the traffic log is cleared, so the returned * content is only the traffic seen since the last call. * * @param type The type of data to return the network traffic as. Valid values are: json, xml, or * plain. * @return A string representation in the defined type of the network traffic seen by the browser. */ @Override public String captureNetworkTraffic(String type) { System.err.println("Sorry, no support for things as such : we are not hackers!"); return ""; } /** * Tells the Selenium server to add the specificed key and value as a custom outgoing request * header. This only works if the browser is configured to use the built in Selenium proxy. * * @param key the header name. * @param value the header value. */ @Override public void addCustomRequestHeader(String key, String value) { System.err.println("Sorry, no support for things as such"); } /** * Kills the running Selenium Server and all browser sessions. After you run this command, you * will no longer be able to send commands to the server; you can't remotely start the server once * it has been stopped. Normally you should prefer to run the "stop" command, which terminates the * current browser session, rather than shutting down the entire server. */ @Override public void shutDownSeleniumServer() { System.err.println("Sorry, no support for things as such"); } /** * Retrieve the last messages logged on a specific remote control. Useful for error reports, * especially when running multiple remote controls in a distributed environment. The maximum * number of log messages that can be retrieve is configured on remote control startup. * * @return The last N log messages as a multi-line string. */ @Override public String retrieveLastRemoteControlLogs() { System.err.println("Sorry, no support for things as such"); return ""; } /** * Simulates a user pressing a key (without releasing it yet) by sending a native operating system * keystroke. This function uses the java.awt.Robot class to send a keystroke; this more * accurately simulates typing a key on the keyboard. It does not honor settings from the * shiftKeyDown, controlKeyDown, altKeyDown and metaKeyDown commands, and does not target any * particular HTML element. To send a keystroke to a particular element, focus on the element * first before running this command. * * @param keycode an integer keycode number corresponding to a java.awt.event.KeyEvent; note that * Java keycodes are NOT the same thing as JavaScript keycodes! */ @Override public void keyDownNative(String keycode) { System.err.println("Sorry, no support for events as such"); } /** * Simulates a user releasing a key by sending a native operating system keystroke. This function * uses the java.awt.Robot class to send a keystroke; this more accurately simulates typing a key * on the keyboard. It does not honor settings from the shiftKeyDown, controlKeyDown, altKeyDown * and metaKeyDown commands, and does not target any particular HTML element. To send a keystroke * to a particular element, focus on the element first before running this command. * * @param keycode an integer keycode number corresponding to a java.awt.event.KeyEvent; note that * Java keycodes are NOT the same thing as JavaScript keycodes! */ @Override public void keyUpNative(String keycode) { System.err.println("Sorry, no support for events as such"); } /** * Simulates a user pressing and releasing a key by sending a native operating system keystroke. * This function uses the java.awt.Robot class to send a keystroke; this more accurately simulates * typing a key on the keyboard. It does not honor settings from the shiftKeyDown, controlKeyDown, * altKeyDown and metaKeyDown commands, and does not target any particular HTML element. To send a * keystroke to a particular element, focus on the element first before running this command. * * @param keycode an integer keycode number corresponding to a java.awt.event.KeyEvent; note that * Java keycodes are NOT the same thing as JavaScript keycodes! */ @Override public void keyPressNative(String keycode) { System.err.println("Sorry, no support for events as such"); } /** * Zooms out the view port by one unit */ public void zoomOut(){ zoomOut(1); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy