+ * Key methods are {@link WebDriver#get(String)}, which is used to load a new web page, and the + * various methods similar to {@link WebDriver#findElement(By)}, which is used to find + * {@link WebElement}s. + *
+ * Currently, you will need to instantiate implementations of this class directly. It is hoped that + * you write your tests against this interface so that you may "swap in" a more fully featured + * browser when there is a requirement for one. + *
+ * Note that all methods that use XPath to locate elements will throw a {@link RuntimeException}
+ * should there be an error thrown by the underlying XPath engine.
+ */
+public interface WebDriver extends SearchContext {
+ // Navigation
+
+ /**
+ * Load a new web page in the current browser window. This is done using an HTTP GET operation,
+ * and the method will block until the load is complete. This will follow redirects issued either
+ * by the server or as a meta-redirect from within the returned HTML. Should a meta-redirect
+ * "rest" for any duration of time, it is best to wait until this timeout is over, since should
+ * the underlying page change whilst your test is executing the results of future calls against
+ * this interface will be against the freshly loaded page. Synonym for
+ * {@link org.openqa.selenium.WebDriver.Navigation#to(String)}.
+ *
+ * @param url The URL to load. It is best to use a fully qualified URL
+ */
+ void get(String url);
+
+ /**
+ * Get a string representing the current URL that the browser is looking at.
+ *
+ * @return The URL of the page currently loaded in the browser
+ */
+ String getCurrentUrl();
+
+ // General properties
+
+ /**
+ * The title of the current page.
+ *
+ * @return The title of the current page, with leading and trailing whitespace stripped, or null
+ * if one is not already set
+ */
+ String getTitle();
+
+ /**
+ * Find all elements within the current page using the given mechanism.
+ * This method is affected by the 'implicit wait' times in force at the time of execution. When
+ * implicitly waiting, this method will return as soon as there are more than 0 items in the
+ * found collection, or will return an empty list if the timeout is reached.
+ *
+ * @param by The locating mechanism to use
+ * @return A list of all {@link WebElement}s, or an empty list if nothing matches
+ * @see org.openqa.selenium.By
+ * @see org.openqa.selenium.WebDriver.Timeouts
+ */
+
+ * findElement should not be used to look for non-present elements, use {@link #findElements(By)}
+ * and assert zero length response instead.
+ *
+ * @param by The locating mechanism
+ * @return The first matching element on the current page
+ * @throws NoSuchElementException If no matching elements are found
+ * @see org.openqa.selenium.By
+ * @see org.openqa.selenium.WebDriver.Timeouts
+ */
+
+ * To set the logging preferences {@link LoggingPreferences}.
+ *
+ * @return A Logs interface.
+ */
+ @Beta
+ Logs logs();
+ }
+
+ /**
+ * An interface for managing timeout behavior for WebDriver instances.
+ */
+ interface Timeouts {
+
+ /**
+ * Specifies the amount of time the driver should wait when searching for an element if it is
+ * not immediately present.
+ *
+ * When searching for a single element, the driver should poll the page until the element has
+ * been found, or this timeout expires before throwing a {@link NoSuchElementException}. When
+ * searching for multiple elements, the driver should poll the page until at least one element
+ * has been found or this timeout has expired.
+ *
+ * Increasing the implicit wait timeout should be used judiciously as it will have an adverse
+ * effect on test run time, especially when used with slower location strategies like XPath.
+ *
+ * @param time The amount of time to wait.
+ * @param unit The unit of measure for {@code time}.
+ * @return A self reference.
+ */
+ Timeouts implicitlyWait(long time, TimeUnit unit);
+
+ /**
+ * Sets the amount of time to wait for an asynchronous script to finish execution before
+ * throwing an error. If the timeout is negative, then the script will be allowed to run
+ * indefinitely.
+ *
+ * @param time The timeout value.
+ * @param unit The unit of time.
+ * @return A self reference.
+ * @see JavascriptExecutor#executeAsyncScript(String, Object...)
+ */
+ Timeouts setScriptTimeout(long time, TimeUnit unit);
+
+ /**
+ * Sets the amount of time to wait for a page load to complete before throwing an error.
+ * If the timeout is negative, page loads can be indefinite.
+ *
+ * @param time The timeout value.
+ * @param unit The unit of time.
+ * @return A Timeouts interface.
+ */
+ Timeouts pageLoadTimeout(long time, TimeUnit unit);
+ }
+
+ /**
+ * Used to locate a given frame or window.
+ */
+ interface TargetLocator {
+ /**
+ * Select a frame by its (zero-based) index. Selecting a frame by index is equivalent to the
+ * JS expression window.frames[index] where "window" is the DOM window represented by the
+ * current context. Once the frame has been selected, all subsequent calls on the WebDriver
+ * interface are made to that frame.
+ *
+ * @param index (zero-based) index
+ * @return This driver focused on the given frame
+ * @throws NoSuchFrameException If the frame cannot be found
+ */
+ WebDriver frame(int index);
+
+ /**
+ * Select a frame by its name or ID. Frames located by matching name attributes are always given
+ * precedence over those matched by ID.
+ *
+ * @param nameOrId the name of the frame window, the id of the <frame> or <iframe>
+ * element, or the (zero-based) index
+ * @return This driver focused on the given frame
+ * @throws NoSuchFrameException If the frame cannot be found
+ */
+ WebDriver frame(String nameOrId);
+
+ /**
+ * Select a frame using its previously located {@link WebElement}.
+ *
+ * @param frameElement The frame element to switch to.
+ * @return This driver focused on the given frame.
+ * @throws NoSuchFrameException If the given element is neither an IFRAME nor a FRAME element.
+ * @throws StaleElementReferenceException If the WebElement has gone stale.
+ * @see WebDriver#findElement(By)
+ */
+ WebDriver frame(WebElement frameElement);
+
+ /**
+ * Change focus to the parent context. If the current context is the top level browsing context,
+ * the context remains unchanged.
+ *
+ * @return This driver focused on the parent frame
+ */
+ WebDriver parentFrame();
+
+ /**
+ * Switch the focus of future commands for this driver to the window with the given name/handle.
+ *
+ * @param nameOrHandle The name of the window or the handle as returned by
+ * {@link WebDriver#getWindowHandle()}
+ * @return This driver focused on the given window
+ * @throws NoSuchWindowException If the window cannot be found
+ */
+ WebDriver window(String nameOrHandle);
+
+ /**
+ * Selects either the first frame on the page, or the main document when a page contains
+ * iframes.
+ *
+ * @return This driver focused on the top window/first frame.
+ */
+ WebDriver defaultContent();
+
+ /**
+ * Switches to the element that currently has focus within the document currently "switched to",
+ * or the body element if this cannot be detected. This matches the semantics of calling
+ * "document.activeElement" in Javascript.
+ *
+ * @return The WebElement with focus, or the body element if no element with focus can be
+ * detected.
+ */
+ WebElement activeElement();
+
+ /**
+ * Switches to the currently active modal dialog for this particular driver instance.
+ *
+ * @return A handle to the dialog.
+ * @throws NoAlertPresentException If the dialog cannot be found
+ */
+ Alert alert();
+ }
+
+ interface Navigation {
+ /**
+ * Move back a single "item" in the browser's history.
+ */
+ void back();
+
+ /**
+ * Move a single "item" forward in the browser's history. Does nothing if we are on the latest
+ * page viewed.
+ */
+ void forward();
+
+
+ /**
+ * Load a new web page in the current browser window. This is done using an HTTP GET operation,
+ * and the method will block until the load is complete. This will follow redirects issued
+ * either by the server or as a meta-redirect from within the returned HTML. Should a
+ * meta-redirect "rest" for any duration of time, it is best to wait until this timeout is over,
+ * since should the underlying page change whilst your test is executing the results of future
+ * calls against this interface will be against the freshly loaded page.
+ *
+ * @param url The URL to load. It is best to use a fully qualified URL
+ */
+ void to(String url);
+
+ /**
+ * Overloaded version of {@link #to(String)} that makes it easy to pass in a URL.
+ *
+ * @param url URL
+ */
+ void to(URL url);
+
+ /**
+ * Refresh the current page
+ */
+ void refresh();
+ }
+
+ /**
+ * An interface for managing input methods.
+ */
+ interface ImeHandler {
+ /**
+ * All available engines on the machine. To use an engine, it has to be activated.
+ *
+ * @return list of available IME engines.
+ * @throws ImeNotAvailableException if the host does not support IME.
+ */
+ List
+ * All method calls will do a freshness check to ensure that the element reference is still valid.
+ * This essentially determines whether or not the element is still attached to the DOM. If this test
+ * fails, then an {@link org.openqa.selenium.StaleElementReferenceException} is thrown, and all
+ * future calls to this instance will fail.
+ */
+public interface WebElement extends SearchContext, TakesScreenshot {
+ /**
+ * Click this element. If this causes a new page to load, you
+ * should discard all references to this element and any further
+ * operations performed on this element will throw a
+ * StaleElementReferenceException.
+ *
+ * Note that if click() is done by sending a native event (which is
+ * the default on most browsers/platforms) then the method will
+ * _not_ wait for the next page to load and the caller should verify
+ * that themselves.
+ *
+ *
+ * There are some preconditions for an element to be clicked. The
+ * element must be visible and it must have a height and width
+ * greater then 0.
+ *
+ * @throws StaleElementReferenceException If the element no
+ * longer exists as initially defined
+ */
+ void click();
+
+ /**
+ * If this current element is a form, or an element within a form, then this will be submitted to
+ * the remote server. If this causes the current page to change, then this method will block until
+ * the new page is loaded.
+ *
+ * @throws NoSuchElementException If the given element is not within a form
+ */
+ void submit();
+
+ /**
+ * Use this method to simulate typing into an element, which may set its value.
+ *
+ * @param keysToSend character sequence to send to the element
+ */
+ void sendKeys(CharSequence... keysToSend);
+
+ /**
+ * If this element is a text entry element, this will clear the value. Has no effect on other
+ * elements. Text entry elements are INPUT and TEXTAREA elements.
+ *
+ * Note that the events fired by this event may not be as you'd expect. In particular, we don't
+ * fire any keyboard or mouse events. If you want to ensure keyboard events are fired, consider
+ * using something like {@link #sendKeys(CharSequence...)} with the backspace key. To ensure
+ * you get a change event, consider following with a call to {@link #sendKeys(CharSequence...)}
+ * with the tab key.
+ */
+ void clear();
+
+ /**
+ * Get the tag name of this element. Not the value of the name attribute: will return
+ *
+ * async, autofocus, autoplay, checked, compact, complete, controls, declare, defaultchecked,
+ * defaultselected, defer, disabled, draggable, ended, formnovalidate, hidden, indeterminate,
+ * iscontenteditable, ismap, itemscope, loop, multiple, muted, nohref, noresize, noshade,
+ * novalidate, nowrap, open, paused, pubdate, readonly, required, reversed, scoped, seamless,
+ * seeking, selected, spellcheck, truespeed, willvalidate
+ *
+ * Finally, the following commonly mis-capitalized attribute/property names are evaluated as
+ * expected:
+ *
+ *
+ * findElement should not be used to look for non-present elements, use {@link #findElements(By)}
+ * and assert zero length response instead.
+ *
+ * @param by The locating mechanism
+ * @return The first matching element on the current context.
+ * @throws NoSuchElementException If no matching elements are found
+ * @see org.openqa.selenium.By
+ * @see org.openqa.selenium.WebDriver.Timeouts
+ */
+
+ * Note that shorthand CSS properties (e.g. background, font, border, border-top, margin,
+ * margin-top, padding, padding-top, list-style, outline, pause, cue) are not returned,
+ * in accordance with the
+ * DOM CSS2 specification
+ * - you should directly access the longhand properties (e.g. background-color) to access the
+ * desired values.
+ *
+ * @param propertyName the css property name of the element
+ * @return The current, computed value of the property.
+ */
+ String getCssValue(String propertyName);
+}
diff --git a/src/main/java/org/openqa/selenium/internal/FindsByClassName.java b/src/main/java/org/openqa/selenium/internal/FindsByClassName.java
new file mode 100644
index 000000000..cc28072ec
--- /dev/null
+++ b/src/main/java/org/openqa/selenium/internal/FindsByClassName.java
@@ -0,0 +1,28 @@
+// Licensed to the Software Freedom Conservancy (SFC) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The SFC licenses this file
+// to you 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.internal;
+
+import org.openqa.selenium.WebElement;
+
+import java.util.List;
+
+public interface FindsByClassName {
+ "input"
for the element <input name="foo" />
.
+ *
+ * @return The tag name of this element.
+ */
+ String getTagName();
+
+ /**
+ * Get the value of a the given attribute of the element. Will return the current value, even if
+ * this has been modified after the page has been loaded. More exactly, this method will return
+ * the value of the given attribute, unless that attribute is not present, in which case the value
+ * of the property with the same name is returned (for example for the "value" property of a
+ * textarea element). If neither value is set, null is returned. The "style" attribute is
+ * converted as best can be to a text representation with a trailing semi-colon. The following are
+ * deemed to be "boolean" attributes, and will return either "true" or null:
+ *
+ *
+ *
+ * @param name The name of the attribute.
+ * @return The attribute/property's current value or null if the value is not set.
+ */
+ String getAttribute(String name);
+
+ /**
+ * Determine whether or not this element is selected or not. This operation only applies to input
+ * elements such as checkboxes, options in a select and radio buttons.
+ *
+ * @return True if the element is currently selected or checked, false otherwise.
+ */
+ boolean isSelected();
+
+ /**
+ * Is the element currently enabled or not? This will generally return true for everything but
+ * disabled input elements.
+ *
+ * @return True if the element is enabled, false otherwise.
+ */
+ boolean isEnabled();
+
+ /**
+ * Get the visible (i.e. not hidden by CSS) innerText of this element, including sub-elements,
+ * without any leading or trailing whitespace.
+ *
+ * @return The innerText of this element.
+ */
+ String getText();
+
+ /**
+ * Find all elements within the current context using the given mechanism. When using xpath be
+ * aware that webdriver follows standard conventions: a search prefixed with "//" will search the
+ * entire document, not just the children of this current node. Use ".//" to limit your search to
+ * the children of this WebElement.
+ * This method is affected by the 'implicit wait' times in force at the time of execution. When
+ * implicitly waiting, this method will return as soon as there are more than 0 items in the
+ * found collection, or will return an empty list if the timeout is reached.
+ *
+ * @param by The locating mechanism to use
+ * @return A list of all {@link WebElement}s, or an empty list if nothing matches.
+ * @see org.openqa.selenium.By
+ * @see org.openqa.selenium.WebDriver.Timeouts
+ */
+