Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 59 additions & 85 deletions java/client/src/org/openqa/selenium/By.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,12 @@

package org.openqa.selenium;

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 java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.stream.Stream;

import static java.util.stream.Collectors.joining;
Expand Down Expand Up @@ -166,7 +159,22 @@ public String toString() {
return "[unknown locator]";
}

public static class ById extends By implements Serializable {
public abstract static class StandardLocator extends By {
@Override
public WebElement findElement(SearchContext context) {
return context.findElement(this);
}

@Override
public List<WebElement> findElements(SearchContext context) {
return context.findElements(this);
}

public abstract <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder);
public abstract <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder);
}

public static class ById extends StandardLocator implements Serializable {

private static final long serialVersionUID = 5341968046120372169L;

Expand All @@ -181,19 +189,13 @@ public ById(String id) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
if (context instanceof FindsById) {
return ((FindsById) context).findElementsById(id);
}
return ((FindsByXPath) context).findElementsByXPath(".//*[@id = '" + id + "']");
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("id", id);
}

@Override
public WebElement findElement(SearchContext context) {
if (context instanceof FindsById) {
return ((FindsById) context).findElementById(id);
}
return ((FindsByXPath) context).findElementByXPath(".//*[@id = '" + id + "']");
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("id", id);
}

@Override
Expand All @@ -209,7 +211,7 @@ private Map<String, Object> toJson() {
}
}

public static class ByLinkText extends By implements Serializable {
public static class ByLinkText extends StandardLocator implements Serializable {

private static final long serialVersionUID = 1967414585359739708L;

Expand All @@ -224,13 +226,13 @@ public ByLinkText(String linkText) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
return ((FindsByLinkText) context).findElementsByLinkText(linkText);
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("link text", linkText);
}

@Override
public WebElement findElement(SearchContext context) {
return ((FindsByLinkText) context).findElementByLinkText(linkText);
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("link text", linkText);
}

@Override
Expand All @@ -246,7 +248,7 @@ private Map<String, Object> toJson() {
}
}

public static class ByPartialLinkText extends By implements Serializable {
public static class ByPartialLinkText extends StandardLocator implements Serializable {

private static final long serialVersionUID = 1163955344140679054L;

Expand All @@ -261,13 +263,13 @@ public ByPartialLinkText(String partialLinkText) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
return ((FindsByLinkText) context).findElementsByPartialLinkText(partialLinkText);
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("partial link text", partialLinkText);
}

@Override
public WebElement findElement(SearchContext context) {
return ((FindsByLinkText) context).findElementByPartialLinkText(partialLinkText);
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("partial link text", partialLinkText);
}

@Override
Expand All @@ -283,7 +285,7 @@ private Map<String, Object> toJson() {
}
}

public static class ByName extends By implements Serializable {
public static class ByName extends StandardLocator implements Serializable {

private static final long serialVersionUID = 376317282960469555L;

Expand All @@ -298,19 +300,13 @@ public ByName(String name) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
if (context instanceof FindsByName) {
return ((FindsByName) context).findElementsByName(name);
}
return ((FindsByXPath) context).findElementsByXPath(".//*[@name = '" + name + "']");
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("name", name);
}

@Override
public WebElement findElement(SearchContext context) {
if (context instanceof FindsByName) {
return ((FindsByName) context).findElementByName(name);
}
return ((FindsByXPath) context).findElementByXPath(".//*[@name = '" + name + "']");
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("name", name);
}

@Override
Expand All @@ -326,7 +322,7 @@ private Map<String, Object> toJson() {
}
}

public static class ByTagName extends By implements Serializable {
public static class ByTagName extends StandardLocator implements Serializable {

private static final long serialVersionUID = 4699295846984948351L;

Expand All @@ -341,19 +337,13 @@ public ByTagName(String tagName) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
if (context instanceof FindsByTagName) {
return ((FindsByTagName) context).findElementsByTagName(tagName);
}
return ((FindsByXPath) context).findElementsByXPath(".//" + tagName);
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("tag name", tagName);
}

@Override
public WebElement findElement(SearchContext context) {
if (context instanceof FindsByTagName) {
return ((FindsByTagName) context).findElementByTagName(tagName);
}
return ((FindsByXPath) context).findElementByXPath(".//" + tagName);
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("tag name", tagName);
}

@Override
Expand All @@ -369,7 +359,7 @@ private Map<String, Object> toJson() {
}
}

public static class ByXPath extends By implements Serializable {
public static class ByXPath extends StandardLocator implements Serializable {

private static final long serialVersionUID = -6727228887685051584L;

Expand All @@ -385,13 +375,13 @@ public ByXPath(String xpathExpression) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
return ((FindsByXPath) context).findElementsByXPath(xpathExpression);
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("xpath", xpathExpression);
}

@Override
public WebElement findElement(SearchContext context) {
return ((FindsByXPath) context).findElementByXPath(xpathExpression);
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("xpath", xpathExpression);
}

@Override
Expand All @@ -407,7 +397,7 @@ private Map<String, Object> toJson() {
}
}

public static class ByClassName extends By implements Serializable {
public static class ByClassName extends StandardLocator implements Serializable {

private static final long serialVersionUID = -8737882849130394673L;

Expand All @@ -423,21 +413,15 @@ public ByClassName(String className) {
}

@Override
public List<WebElement> findElements(SearchContext context) {
if (context instanceof FindsByClassName) {
return ((FindsByClassName) context).findElementsByClassName(className);
}
return ((FindsByXPath) context).findElementsByXPath(
".//*[" + containingWord("class", className) + "]");
public <T extends SearchContext> WebElement findElement(T driver,
BiFunction<String, String, WebElement> finder) {
return finder.apply("class name", className);
}

@Override
public WebElement findElement(SearchContext context) {
if (context instanceof FindsByClassName) {
return ((FindsByClassName) context).findElementByClassName(className);
}
return ((FindsByXPath) context).findElementByXPath(
".//*[" + containingWord("class", className) + "]");
public <T extends SearchContext> List<WebElement> findElements(T driver,
BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("class name", className);
}

/**
Expand Down Expand Up @@ -474,7 +458,7 @@ private Map<String, Object> toJson() {

}

public static class ByCssSelector extends By implements Serializable {
public static class ByCssSelector extends StandardLocator implements Serializable {

private static final long serialVersionUID = -3910258723099459239L;

Expand All @@ -484,28 +468,18 @@ public ByCssSelector(String cssSelector) {
if (cssSelector == null) {
throw new IllegalArgumentException("Cannot find elements when the selector is null");
}

this.cssSelector = cssSelector;
}

@Override
public WebElement findElement(SearchContext context) {
if (context instanceof FindsByCssSelector) {
return ((FindsByCssSelector) context).findElementByCssSelector(cssSelector);
}

throw new WebDriverException(
"Driver does not support finding an element by selector: " + cssSelector);
public <T extends SearchContext> WebElement findElement(T driver, BiFunction<String, String, WebElement> finder) {
return finder.apply("css selector", cssSelector);
}

@Override
public List<WebElement> findElements(SearchContext context) {
if (context instanceof FindsByCssSelector) {
return ((FindsByCssSelector) context).findElementsByCssSelector(cssSelector);
}

throw new WebDriverException(
"Driver does not support finding elements by selector: " + cssSelector);
public <T extends SearchContext> List<WebElement> findElements(T driver, BiFunction<String, String, List<WebElement>> finder) {
return finder.apply("css selector", cssSelector);
}

@Override
Expand Down
32 changes: 0 additions & 32 deletions java/client/src/org/openqa/selenium/internal/FindsByClassName.java

This file was deleted.

This file was deleted.

32 changes: 0 additions & 32 deletions java/client/src/org/openqa/selenium/internal/FindsById.java

This file was deleted.

Loading