org.uiautomation.ios.wkrdp.RemoteIOSWebDriver.java Source code

Java tutorial

Introduction

Here is the source code for org.uiautomation.ios.wkrdp.RemoteIOSWebDriver.java

Source

/*
 * Copyright 2012 ios-driver committers.
 *
 *  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 Licence at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the License
 *  is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 *  or implied. See the License for the specific language governing permissions and limitations under
 *  the License.
 */

package org.uiautomation.ios.wkrdp;

import com.google.common.collect.ImmutableList;

import org.json.JSONArray;
import org.json.JSONException;
import org.openqa.selenium.*;
import org.uiautomation.ios.context.BaseWebInspector;
import org.uiautomation.ios.context.WebInspector;
import org.uiautomation.ios.server.DOMContext;
import org.uiautomation.ios.server.RealDevice;
import org.uiautomation.ios.server.ServerSideSession;
import org.uiautomation.ios.server.configuration.Configuration;
import org.uiautomation.ios.wkrdp.command.Network;
import org.uiautomation.ios.wkrdp.command.Page;
import org.uiautomation.ios.wkrdp.internal.RealDeviceProtocolImpl;
import org.uiautomation.ios.wkrdp.internal.SimulatorProtocolImpl;
import org.uiautomation.ios.wkrdp.internal.WebKitRemoteDebugProtocol;
import org.uiautomation.ios.wkrdp.internal.WebKitSyncronizer;
import org.uiautomation.ios.wkrdp.message.WebkitApplication;
import org.uiautomation.ios.wkrdp.message.WebkitDevice;
import org.uiautomation.ios.wkrdp.message.WebkitPage;
import org.uiautomation.ios.wkrdp.model.NodeId;
import org.uiautomation.ios.wkrdp.model.RemoteWebElement;
import org.uiautomation.ios.wkrdp.model.RemoteWebNativeBackedElement;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Logger;

public class RemoteIOSWebDriver {

    public static void main(String[] args) throws Exception {
        RemoteIOSWebDriver driver = new RemoteIOSWebDriver(null);
        //driver.connect(uiCatalog);
        driver.switchTo(driver.getPages().get(0));
        driver.get("http://ebay.co.uk/");
        RemoteWebElement body = driver.findElementByCssSelector("body");
        driver.get("http://google.co.uk/");
        body = driver.findElementByCssSelector("body");

        driver.stop();

        driver = new RemoteIOSWebDriver(null);
        //driver.connect(uiCatalog);
        driver.switchTo(driver.getPages().get(0));
        driver.get("http://ebay.co.uk/");
        body = driver.findElementByCssSelector("body");
        driver.get("http://google.co.uk/");
        body = driver.findElementByCssSelector("body");
    }

    static String safari = "com.apple.mobilesafari";
    static String uiCatalog = "com.yourcompany.UICatalog";

    //private SimulatorSession simulator;
    //private Object usbProtocol;
    private String bundleId;

    private WebKitRemoteDebugProtocol protocol;
    private WebkitDevice device;
    private List<WebkitApplication> applications = new ArrayList<WebkitApplication>();
    private final ServerSideSession session;
    private final String connectionKey;
    private BaseWebInspector currentInspector;
    private Map<Integer, BaseWebInspector> inspectors = new HashMap<Integer, BaseWebInspector>();
    private static final Logger log = Logger.getLogger(RemoteIOSWebDriver.class.getName());
    private List<WebkitPage> pages = new ArrayList<WebkitPage>();
    private final List<WebInspector> created = new ArrayList<WebInspector>();
    private final WebKitSyncronizer sync;

    public RemoteIOSWebDriver(ServerSideSession session, ResponseFinder... finders) {
        this.session = session;
        connectionKey = UUID.randomUUID().toString();
        sync = new WebKitSyncronizer(this);
        MessageListener notification = new WebKitNotificationListener(this, sync, session);
        if (session.getDevice() instanceof RealDevice) {
            if (!Configuration.BETA_FEATURE) {
                Configuration.off();
            }
            protocol = new RealDeviceProtocolImpl(notification, finders);

        } else {
            protocol = new SimulatorProtocolImpl(notification, finders);

        }
        protocol.register();
        sync.waitForSimToRegister();
        sync.waitForSimToSendApps();

        if (applications.size() == 1) {
            connect(applications.get(0).getBundleId());
        } else {
            log.warning("session created but application size=" + applications.size());
        }
    }

    public void setPages(List<WebkitPage> pages) {
        this.pages = ImmutableList.copyOf(pages);
    }

    public List<WebkitPage> getPages() {
        return pages;
    }

    /*public boolean isConnected() {
      log.fine("Applications  " + applications.size());
      return !applications.isEmpty();
    }*/

    public void start() {
        protocol.start();
    }

    public void stop() {
        protocol.stop();
    }

    public RemoteWebElement createElement(String reference) {
        int pageId = Integer.parseInt(reference.split("_")[0]);
        int nodeId = Integer.parseInt(reference.split("_")[1]);

        if (currentInspector.getPageIdentifier() != pageId) {
            throw new StaleElementReferenceException("Node " + nodeId + "is stale.It might still exist, but the "
                    + "window with focus has changed.");
        }
        if (session != null) {
            return new RemoteWebNativeBackedElement(new NodeId(nodeId), currentInspector, session);
        } else {
            return new RemoteWebElement(new NodeId(nodeId), currentInspector);
        }
    }

    public void connect(String bundleId) {
        List<WebkitApplication> knownApps = getApplications();
        for (WebkitApplication app : knownApps) {
            if (bundleId.equals(app.getBundleId())) {
                this.bundleId = bundleId;
                protocol.connect(bundleId);
                sync.waitForSimToSendPages();
                switchTo(getPages().get(0));
                if (getPages().size() > 1) {
                    log.warning("Application started, but already have " + getPages().size()
                            + " webviews. Connecting to the first one.");
                }
                return;
            }
        }
        throw new WebDriverException(bundleId + " not in the list " + knownApps
                + ".Either it's not started, or it has no webview to connect to.");
    }

    public synchronized void setApplications(List<WebkitApplication> applications) {
        this.applications = applications;
    }

    // TODO freynaud return a copy.
    public synchronized List<WebkitApplication> getApplications() {
        return applications;
    }

    public void switchTo(String pageId) {
        for (WebkitPage p : getPages()) {
            if ((p.getPageId() + "").equals(pageId)) {
                switchTo(p);
                return;
            }
        }
        throw new WebDriverException("no such page " + pageId);
    }

    public void switchTo(WebkitPage page) {
        currentInspector = connect(page);
        inspectors.put(page.getPageId(), currentInspector);
    }

    private BaseWebInspector connect(WebkitPage webkitPage) {
        for (WebkitPage page : getPages()) {
            if (page.equals(webkitPage)) {
                WebInspector inspector = new WebInspector(null, webkitPage.getPageId(), protocol, bundleId,
                        connectionKey, session);

                protocol.attachToPage(page.getPageId());
                inspector.sendCommand(Page.enablePageEvent());
                inspector.sendCommand(Network.enable());
                boolean ok = created.add(inspector);
                if (ok) {
                    protocol.addListener(inspector);
                }
                return inspector;
            }
        }
        throw new WebDriverException("Cannot connect to page " + webkitPage + ".Cannot find it.");
    }

    public void waitForPageToLoad() {
        //currentInspector.waitForPageToLoad();
    }

    /*public RemoteWebElement getDocument() {
      return currentInspector.getDocument();
    }*/

    public void get(String url) {
        currentInspector.get(url);
    }

    public List<Cookie> getCookies() {
        return currentInspector.getCookies();
    }

    public void deleteCookie(String name, String domain) {
        currentInspector.deleteCookie(name, domain);
    }

    public String getCurrentUrl() {
        try {
            return currentInspector.getCurrentUrl(); //To change body of implemented methods use File | Settings | File Templates.
        } catch (Exception e) {
            e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
            return null;
        }
    }

    public String getTitle() {
        return currentInspector.getTitle();
    }

    public int getCurrentPageID() {
        return currentInspector.getPageIdentifier();
    }

    public List<RemoteWebElement> findElements(By by) {
        return null; //To change body of implemented methods use File | Settings | File Templates.
    }

    public RemoteWebElement findElement(By by) {
        return null; //To change body of implemented methods use File | Settings | File Templates.
    }

    public RemoteWebElement findElementByCssSelector(String cssSelector) throws Exception {
        return currentInspector.findElementByCSSSelector(cssSelector);
    }

    public List<RemoteWebElement> findElementsByCssSelector(String cssSelector) {
        return currentInspector.findElementsByCSSSelector(cssSelector);
    }

    public String getPageSource() {
        return currentInspector.getPageSource();
    }

    public Dimension getSize() throws Exception {
        return currentInspector.getSize();
    }

    public void close() {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void quit() {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public List<WebkitPage> getWindowHandles() {
        return getPages();
    }

    public String getWindowHandle() {
        return "" + currentInspector.getPageIdentifier();
    }

    public int getWindowHandleIndex() {
        int pageId = currentInspector.getPageIdentifier();
        for (WebkitPage p : getPages()) {
            if (p.getPageId() == pageId) {
                return getPages().indexOf(p);
            }
        }
        throw new WebDriverException("Cannot find current page.");
    }

    public int getWindowHandleIndexDifference(String pageId) {
        // first, sort pages.
        List<WebkitPage> pages = getPages();
        int currentIndex = -1;
        for (WebkitPage p : pages) {
            if (p.getPageId() == currentInspector.getPageIdentifier()) {
                currentIndex = pages.indexOf(p);
            }
        }
        int destination = -1;
        for (WebkitPage p : pages) {
            if ((p.getPageId() + "").equals(pageId)) {
                if (p.isITunesAd()) {
                    log.warning("Trying to switch to an ad. You will need to be on the correct page already to do "
                            + "that.If you're not, random error will occur.");
                    return 0;
                } else {
                    destination = pages.indexOf(p);
                }
            }
        }
        return destination - currentIndex;
    }

    public WebDriver.TargetLocator switchTo() {
        return null; //To change body of implemented methods use File | Settings | File Templates.
    }

    public void back() throws JSONException {

        currentInspector.back();

    }

    public void forward() {
        try {
            currentInspector.forward();
        } catch (Exception e) {
            e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
        }
    }

    public void refresh() {
        try {
            currentInspector.refresh();
        } catch (Exception e) {
            e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
        }
    }

    public WebDriver.Options manage() {
        return null; //To change body of implemented methods use File | Settings | File Templates.
    }

    public Object executeScript(String script, JSONArray args) {
        return currentInspector.executeScript(script, args);
    }

    public Object executeAsyncScript(String script, Object... args) {
        return null; //To change body of implemented methods use File | Settings | File Templates.

    }

    // TODO remove.
    public RemoteWebElement getDocument() {
        return currentInspector.getDocument();
    }

    public boolean isLoading() {
        return !currentInspector.isReady();
    }

    public DOMContext getContext() {
        return currentInspector.getContext();
    }

    public String getLoadedFlag() {
        return currentInspector.getLoadedFlag();
    }

    public synchronized void setDevice(WebkitDevice device) {
        this.device = device;
    }

    public synchronized WebkitDevice getDevice() {
        return device;
    }

}