
org.openqa.selenium.remote.RemoteWebDriver Maven / Gradle / Ivy
The newest version!
/*
Copyright 2007-2009 WebDriver committers
Copyright 2007-2009 Google Inc.
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 org.openqa.selenium.remote;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.HasInputDevices;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keyboard;
import org.openqa.selenium.Keys;
import org.openqa.selenium.Mouse;
import org.openqa.selenium.Platform;
import org.openqa.selenium.Speed;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.internal.FindsByClassName;
import org.openqa.selenium.internal.FindsByCssSelector;
import org.openqa.selenium.internal.FindsById;
import org.openqa.selenium.internal.FindsByLinkText;
import org.openqa.selenium.internal.FindsByName;
import org.openqa.selenium.internal.FindsByTagName;
import org.openqa.selenium.internal.FindsByXPath;
import org.openqa.selenium.remote.internal.JsonToWebElementConverter;
import org.openqa.selenium.remote.internal.WebElementToJsonConverter;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.net.URL;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class RemoteWebDriver implements WebDriver, JavascriptExecutor,
FindsById, FindsByClassName, FindsByLinkText, FindsByName,
FindsByCssSelector, FindsByTagName, FindsByXPath,
HasInputDevices {
private final ErrorHandler errorHandler = new ErrorHandler();
private CommandExecutor executor;
private Capabilities capabilities;
private SessionId sessionId;
protected Process clientProcess;
private JsonToWebElementConverter converter;
// For cglib
protected RemoteWebDriver() {
converter = new JsonToWebElementConverter(this);
}
public RemoteWebDriver(CommandExecutor executor, Capabilities desiredCapabilities) {
this.executor = executor;
converter = new JsonToWebElementConverter(this);
startClient();
startSession(desiredCapabilities);
}
public RemoteWebDriver(Capabilities desiredCapabilities) {
this((URL) null, desiredCapabilities);
}
public RemoteWebDriver(URL remoteAddress, Capabilities desiredCapabilities) {
this(new HttpCommandExecutor(remoteAddress), desiredCapabilities);
}
@SuppressWarnings({"unchecked"})
protected void startSession(Capabilities desiredCapabilities) {
Response response = execute(DriverCommand.NEW_SESSION,
ImmutableMap.of("desiredCapabilities", desiredCapabilities));
Map rawCapabilities = (Map) response.getValue();
DesiredCapabilities returnedCapabilities = new DesiredCapabilities();
for (Map.Entry entry : rawCapabilities.entrySet()) {
// Handle the platform later
if ("platform".equals(entry.getKey())) {
continue;
}
returnedCapabilities.setCapability(entry.getKey(), entry.getValue());
}
String platformString = (String) rawCapabilities.get("platform");
Platform platform;
try {
if (platformString == null || "".equals(platformString)) {
platform = Platform.ANY;
} else {
platform = Platform.valueOf(platformString);
}
} catch (IllegalArgumentException e) {
// The server probably responded with a name matching the os.name
// system property. Try to recover and parse this.
platform = Platform.extractFromSysProperty(platformString);
}
returnedCapabilities.setPlatform(platform);
capabilities = returnedCapabilities;
sessionId = new SessionId(response.getSessionId());
}
/**
* Method called before
* {@link #startSession(Capabilities) starting a new session}. The default
* implementation is a no-op, but subtypes should override this method to
* define custom behavior.
*/
protected void startClient() {
}
/**
* Method called after executing a {@link #quit()} command. Subtypes
*/
protected void stopClient() {
}
public ErrorHandler getErrorHandler() {
return errorHandler;
}
public CommandExecutor getCommandExecutor() {
return executor;
}
protected void setCommandExecutor(CommandExecutor executor) {
this.executor = executor;
}
public Capabilities getCapabilities() {
return capabilities;
}
public void get(String url) {
execute(DriverCommand.GET, ImmutableMap.of("url", url));
}
public String getTitle() {
Response response = execute(DriverCommand.GET_TITLE);
Object value = response.getValue();
return value == null ? "" : value.toString();
}
public String getCurrentUrl() {
return execute(DriverCommand.GET_CURRENT_URL).getValue().toString();
}
public List findElements(By by) {
return by.findElements(this);
}
public WebElement findElement(By by) {
return by.findElement(this);
}
protected WebElement findElement(String by, String using) {
if (using == null) {
throw new IllegalArgumentException("Cannot find elements when the selector is null.");
}
Response response = execute(DriverCommand.FIND_ELEMENT,
ImmutableMap.of("using", by, "value", using));
return (WebElement) response.getValue();
}
@SuppressWarnings("unchecked")
protected List findElements(String by, String using) {
if (using == null) {
throw new IllegalArgumentException("Cannot find elements when the selector is null.");
}
Response response = execute(DriverCommand.FIND_ELEMENTS,
ImmutableMap.of("using", by, "value", using));
return (List) response.getValue();
}
public WebElement findElementById(String using) {
return findElement("id", using);
}
public List findElementsById(String using) {
return findElements("id", using);
}
public WebElement findElementByLinkText(String using) {
return findElement("link text", using);
}
public List findElementsByLinkText(String using) {
return findElements("link text", using);
}
public WebElement findElementByPartialLinkText(String using) {
return findElement("partial link text", using);
}
public List findElementsByPartialLinkText(String using) {
return findElements("partial link text", using);
}
public WebElement findElementByTagName(String using) {
return findElement("tag name", using);
}
public List findElementsByTagName(String using) {
return findElements("tag name", using);
}
public WebElement findElementByName(String using) {
return findElement("name", using);
}
public List findElementsByName(String using) {
return findElements("name", using);
}
public WebElement findElementByClassName(String using) {
return findElement("class name", using);
}
public List findElementsByClassName(String using) {
return findElements("class name", using);
}
public WebElement findElementByCssSelector(String using) {
return findElement("css selector", using);
}
public List findElementsByCssSelector(String using) {
return findElements("css selector", using);
}
public WebElement findElementByXPath(String using) {
return findElement("xpath", using);
}
public List findElementsByXPath(String using) {
return findElements("xpath", using);
}
// Misc
public String getPageSource() {
return (String) execute(DriverCommand.GET_PAGE_SOURCE).getValue();
}
public void close() {
execute(DriverCommand.CLOSE);
}
public void quit() {
try {
execute(DriverCommand.QUIT);
} finally {
sessionId = null;
stopClient();
}
}
@SuppressWarnings({"unchecked"})
public Set getWindowHandles() {
Response response = execute(DriverCommand.GET_WINDOW_HANDLES);
List returnedValues = (List) response.getValue();
return new LinkedHashSet(returnedValues);
}
public String getWindowHandle() {
return String.valueOf(execute(DriverCommand.GET_CURRENT_WINDOW_HANDLE).getValue());
}
public Object executeScript(String script, Object... args) {
if (!capabilities.isJavascriptEnabled()) {
throw new UnsupportedOperationException("You must be using an underlying instance of WebDriver that supports executing javascript");
}
// Escape the quote marks
script = script.replaceAll("\"", "\\\"");
Iterable
© 2015 - 2025 Weber Informatics LLC | Privacy Policy