org.oneandone.qxwebdriver.By.java Source code

Java tutorial

Introduction

Here is the source code for org.oneandone.qxwebdriver.By.java

Source

/* ************************************************************************
    
   qxwebdriver-java
    
   http://github.com/qooxdoo/qxwebdriver-java
    
   Copyright:
 2012-2013 1&1 Internet AG, Germany, http://www.1und1.de
    
   License:
 LGPL: http://www.gnu.org/licenses/lgpl.html
 EPL: http://www.eclipse.org/org/documents/epl-v10.php
 See the license.txt file in the project's top-level directory for details.
    
   Authors:
 * Daniel Wagner (danielwagner)
    
************************************************************************ */
package org.oneandone.qxwebdriver;

import java.util.List;

import org.oneandone.qxwebdriver.resources.JavaScript;
import org.openqa.selenium.InvalidSelectorException;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebElement;

public abstract class By extends org.openqa.selenium.By {

    public WebElement findElement(SearchContext context) {
        return null;
    }

    public List<WebElement> findElements(SearchContext context) {
        return null;
    }

    /**
     * Searches for elements by traversing the qooxdoo application's widget
     * hierarchy. See the <a href="TODO">qxh locator manual page</a> for details.
     *
     * This strategy will ignore any widgets that are not currently visible, as
     * determined by checking the qooxdoo property <a href="http://demo.qooxdoo.org/current/apiviewer/#qx.ui.core.Widget~isSeeable!method_public">seeable</a>.
     *
     * @param locator Locator specification
     * @return By.ByQxh
     */
    public static By qxh(final String locator) {
        if (locator == null) {
            throw new IllegalArgumentException("Can't find elements without a locator string.");
        }

        return new ByQxh(locator, true);
    }

    /**
     * Searches for elements by traversing the qooxdoo application's widget
     * hierarchy. See the <a href="TODO">qxh locator manual page</a> for details.
     *
     * @param locator Locator specification
     * @param onlySeeable <code>false</code> if invisible widgets should be
     * traversed. Note that this can considerably increase execution time.
     * @return configured ByQxh instance
     */
    public static By qxh(final String locator, final Boolean onlySeeable) {
        if (locator == null) {
            throw new IllegalArgumentException("Can't find elements without a locator string.");
        }
        return new ByQxh(locator, onlySeeable);
    }

    /**
     * Mechanisms used to locate elements within a qooxdoo Desktop application.
     *
     */
    public static class ByQxh extends By {

        private final String locator;
        private Boolean onlySeeable;

        public ByQxh(String locator, Boolean onlySeeable) {
            this.locator = locator;
            this.onlySeeable = onlySeeable;
        }

        public List<WebElement> findElements(SearchContext context) {
            //TODO: findByQxh only returns the first match
            throw new RuntimeException("ByQxh.findElements is not yet implemented.");
        }

        /**
         * Searches for elements by traversing the qooxdoo application's widget
         * hierarchy using the current SearchContext as the root node.
         * See the <a href="TODO">qxh locator manual page</a> for details.
         */
        public WebElement findElement(SearchContext context) {
            JavascriptExecutor jsExecutor;

            RemoteWebElement contextElement = null;

            if (context instanceof RemoteWebElement) {
                contextElement = (RemoteWebElement) context;
                jsExecutor = (JavascriptExecutor) contextElement.getWrappedDriver();
            } else {
                jsExecutor = (JavascriptExecutor) context;
            }

            String script = JavaScript.INSTANCE.getValue("qxh");

            try {
                Object result;
                if (contextElement == null) {
                    // OperaDriver.executeScript won't accept null as an argument
                    result = jsExecutor.executeScript(script, locator, onlySeeable);
                } else {
                    try {
                        result = jsExecutor.executeScript(script, locator, onlySeeable,
                                (WebElement) contextElement);
                    } catch (com.opera.core.systems.scope.exceptions.ScopeException e) {
                        // OperaDriver will sometimes throw a ScopeException if executeScript is called
                        // with an OperaWebElement as argument
                        return null;
                    }

                }
                return (WebElement) result;

            } catch (org.openqa.selenium.WebDriverException e) {
                String msg = e.getMessage();
                if (msg.contains("Error resolving qxh path") ||
                // IEDriver doesn't include the original JS exception's message :(
                        msg.contains("JavaScript error")) {
                    return null;
                } else if (msg.contains("Illegal path step")) {
                    String reason = "Invalid qxh selector " + locator.toString();
                    throw new InvalidSelectorException(reason, e);
                } else {
                    String reason = "Error while processing selector " + locator.toString();
                    throw new org.openqa.selenium.WebDriverException(reason, e);
                }
            }
        }

        public String toString() {
            return "By.qxh: " + locator;
        }
    }
}