Skip to content

Commit

Permalink
Make our By classes serializable over json
Browse files Browse the repository at this point in the history
  • Loading branch information
shs96c committed Aug 3, 2019
1 parent 5f7462f commit e8d04db
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 11 deletions.
74 changes: 73 additions & 1 deletion java/client/src/org/openqa/selenium/By.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,15 @@
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.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.joining;

/**
* Mechanism used to locate elements within a document. In order to create your own locating
Expand Down Expand Up @@ -194,6 +202,13 @@ public WebElement findElement(SearchContext context) {
public String toString() {
return "By.id: " + id;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "css selector");
asJson.put("value", Stream.of(id.split("\\s+")).map(str -> "#" + str).collect(joining(" ")));
return Collections.unmodifiableMap(asJson);
}
}

public static class ByLinkText extends By implements Serializable {
Expand Down Expand Up @@ -224,6 +239,13 @@ public WebElement findElement(SearchContext context) {
public String toString() {
return "By.linkText: " + linkText;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "link text");
asJson.put("value", linkText);
return Collections.unmodifiableMap(asJson);
}
}

public static class ByPartialLinkText extends By implements Serializable {
Expand Down Expand Up @@ -254,6 +276,13 @@ public WebElement findElement(SearchContext context) {
public String toString() {
return "By.partialLinkText: " + partialLinkText;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "partial link text");
asJson.put("value", partialLinkText);
return Collections.unmodifiableMap(asJson);
}
}

public static class ByName extends By implements Serializable {
Expand Down Expand Up @@ -290,6 +319,13 @@ public WebElement findElement(SearchContext context) {
public String toString() {
return "By.name: " + name;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "css selector");
asJson.put("value", String.format("*[name='%s']", name.replace("'", "\\'")));
return Collections.unmodifiableMap(asJson);
}
}

public static class ByTagName extends By implements Serializable {
Expand Down Expand Up @@ -326,6 +362,13 @@ public WebElement findElement(SearchContext context) {
public String toString() {
return "By.tagName: " + tagName;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "tag name");
asJson.put("value", tagName);
return Collections.unmodifiableMap(asJson);
}
}

public static class ByXPath extends By implements Serializable {
Expand Down Expand Up @@ -357,6 +400,13 @@ public WebElement findElement(SearchContext context) {
public String toString() {
return "By.xpath: " + xpathExpression;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "xpath");
asJson.put("value", xpathExpression);
return Collections.unmodifiableMap(asJson);
}
}

public static class ByClassName extends By implements Serializable {
Expand Down Expand Up @@ -396,7 +446,13 @@ public WebElement findElement(SearchContext context) {
* Generate a partial XPath expression that matches an element whose specified attribute
* contains the given CSS word. So to match &lt;div class='foo bar'&gt; you would say "//div[" +
* containingWord("class", "foo") + "]".
*
* private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "link text");
asJson.put("value", linkText);
return Collections.unmodifiableMap(asJson);
}
* @param attribute name
* @param word name
* @return XPath fragment
Expand All @@ -409,6 +465,15 @@ private String containingWord(String attribute, String word) {
public String toString() {
return "By.className: " + className;
}

private Map<String, Object> toJson() {

Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "css selector");
asJson.put("value", Stream.of(className.split("\\s+")).map(str -> "." + str).collect(joining(" ")));
return Collections.unmodifiableMap(asJson);
}

}

public static class ByCssSelector extends By implements Serializable {
Expand Down Expand Up @@ -449,5 +514,12 @@ public List<WebElement> findElements(SearchContext context) {
public String toString() {
return "By.cssSelector: " + cssSelector;
}

private Map<String, Object> toJson() {
Map<String, Object> asJson = new HashMap<>();
asJson.put("using", "css selector");
asJson.put("value", cssSelector);
return Collections.unmodifiableMap(asJson);
}
}
}
48 changes: 38 additions & 10 deletions java/client/test/org/openqa/selenium/ByTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@

package org.openqa.selenium;

import org.junit.Test;
import org.openqa.selenium.internal.FindsByClassName;
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.json.Json;

import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
Expand All @@ -29,16 +41,7 @@
import static org.openqa.selenium.By.ByPartialLinkText;
import static org.openqa.selenium.By.ByTagName;
import static org.openqa.selenium.By.ByXPath;

import org.junit.Test;
import org.openqa.selenium.internal.FindsByClassName;
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.util.List;
import static org.openqa.selenium.json.Json.MAP_TYPE;

public class ByTest {

Expand Down Expand Up @@ -164,6 +167,31 @@ public List<WebElement> findElements(SearchContext context) {
locator.hashCode();
}

@Test
public void ensureClassNameIsSerializedProperly() {
// Although it's not legal, make sure we handle the case where people use spaces.
By by = By.className("one two");

Json json = new Json();
Map<String, Object> blob = json.toType(json.toJson(by), MAP_TYPE);

assertThat(blob.get("using")).isEqualTo("css selector");
assertThat(blob.get("value")).isEqualTo(".one .two");
}

@Test
public void ensureIdIsSerializedProperly() {
// Although it's not legal, make sure we handle the case where people use spaces.
By by = By.id("one two");

Json json = new Json();
Map<String, Object> blob = json.toType(json.toJson(by), MAP_TYPE);

assertThat(blob.get("using")).isEqualTo("css selector");
assertThat(blob.get("value")).isEqualTo("#one #two");

}

private interface AllDriver
extends FindsById, FindsByLinkText, FindsByName, FindsByXPath, FindsByTagName,
FindsByClassName, SearchContext {
Expand Down

0 comments on commit e8d04db

Please sign in to comment.