Skip to content

Commit

Permalink
[java] Implementing a convenient devtools method Network.setUserAgent
Browse files Browse the repository at this point in the history
  • Loading branch information
barancev committed Feb 10, 2021
1 parent 4291ec7 commit 6849ee6
Show file tree
Hide file tree
Showing 8 changed files with 201 additions and 0 deletions.
Expand Up @@ -59,6 +59,51 @@ public void disable() {
interceptingTraffic = false;
}

public static class UserAgent {

private final String userAgent;
private final Optional<String> acceptLanguage;
private final Optional<String> platform;

public UserAgent(String userAgent) {
this(userAgent, Optional.empty(), Optional.empty());
}

private UserAgent(String userAgent, Optional<String> acceptLanguage, Optional<String> platform) {
this.userAgent = userAgent;
this.acceptLanguage = acceptLanguage;
this.platform = platform;
}

public String userAgent() {
return userAgent;
}

public UserAgent acceptLanguage(String acceptLanguage) {
return new UserAgent(this.userAgent, Optional.of(acceptLanguage), this.platform);
}

public Optional<String> acceptLanguage() {
return acceptLanguage;
}

public UserAgent platform(String platform) {
return new UserAgent(this.userAgent, this.acceptLanguage, Optional.of(platform));
}

public Optional<String> platform() {
return platform;
}
}

public void setUserAgent(String userAgent) {
devTools.send(setUserAgentOverride(new UserAgent(userAgent)));
}

public void setUserAgent(UserAgent userAgent) {
devTools.send(setUserAgentOverride(userAgent));
}

public void addAuthHandler(Predicate<URI> whenThisMatches, Supplier<Credentials> useTheseCredentials) {
Require.nonNull("URI predicate", whenThisMatches);
Require.nonNull("Credentials", useTheseCredentials);
Expand Down Expand Up @@ -197,6 +242,8 @@ protected HttpRequest createHttpRequest(
return req;
}

protected abstract Command<Void> setUserAgentOverride(UserAgent userAgent);

protected abstract Command<Void> enableNetworkCaching();

protected abstract Command<Void> disableNetworkCaching();
Expand Down
Expand Up @@ -45,6 +45,12 @@ public V86Network(DevTools devTools) {
super(devTools);
}

@Override
protected Command<Void> setUserAgentOverride(UserAgent userAgent) {
return org.openqa.selenium.devtools.v89.network.Network.setUserAgentOverride(
userAgent.userAgent(), userAgent.acceptLanguage(), userAgent.platform(), Optional.empty());
}

@Override
protected Command<Void> enableNetworkCaching() {
return org.openqa.selenium.devtools.v86.network.Network.setCacheDisabled(false);
Expand Down
Expand Up @@ -45,6 +45,12 @@ public V87Network(DevTools devTools) {
super(devTools);
}

@Override
protected Command<Void> setUserAgentOverride(UserAgent userAgent) {
return org.openqa.selenium.devtools.v89.network.Network.setUserAgentOverride(
userAgent.userAgent(), userAgent.acceptLanguage(), userAgent.platform(), Optional.empty());
}

@Override
protected Command<Void> enableNetworkCaching() {
return org.openqa.selenium.devtools.v87.network.Network.setCacheDisabled(false);
Expand Down
Expand Up @@ -45,6 +45,12 @@ public V88Network(DevTools devTools) {
super(devTools);
}

@Override
protected Command<Void> setUserAgentOverride(UserAgent userAgent) {
return org.openqa.selenium.devtools.v89.network.Network.setUserAgentOverride(
userAgent.userAgent(), userAgent.acceptLanguage(), userAgent.platform(), Optional.empty());
}

@Override
protected Command<Void> enableNetworkCaching() {
return org.openqa.selenium.devtools.v88.network.Network.setCacheDisabled(false);
Expand Down
Expand Up @@ -45,6 +45,12 @@ public V89Network(DevTools devTools) {
super(devTools);
}

@Override
protected Command<Void> setUserAgentOverride(UserAgent userAgent) {
return org.openqa.selenium.devtools.v89.network.Network.setUserAgentOverride(
userAgent.userAgent(), userAgent.acceptLanguage(), userAgent.platform(), Optional.empty());
}

@Override
protected Command<Void> enableNetworkCaching() {
return org.openqa.selenium.devtools.v89.network.Network.setCacheDisabled(false);
Expand Down
@@ -0,0 +1,55 @@
// 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.devtools;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.devtools.idealized.Network;

import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;

public class ChangeUserAgentTest extends DevToolsTestBase {

@Test
public void canChangeUserAgent() throws InterruptedException, ExecutionException, TimeoutException {
devTools.getDomains().network().setUserAgent(
new Network.UserAgent("Camembert 1.0")
.platform("FreeBSD").acceptLanguage("da, en-gb, *"));
driver.get(appServer.whereIs("/echo"));

Map<String, String> headers = driver.findElements(By.cssSelector("#headers tr")).stream()
.map(row -> row.findElements(By.tagName("td")))
.collect(Collectors.toMap(cells -> cells.get(0).getText(), cells -> cells.get(1).getText()));
String userAgent = driver.findElements(By.cssSelector("#headers tr")).stream()
.map(row -> row.findElements(By.tagName("td")))
.filter(cells -> cells.get(0).getText().equals("User-Agent"))
.map(cells -> cells.get(1).getText())
.findFirst().orElseThrow();
assertThat(headers).containsEntry("User-Agent", "Camembert 1.0");
assertThat(headers).containsEntry("Accept-Language", "da, en-gb;q=0.9, *;q=0.8");
Object platform = ((JavascriptExecutor) driver).executeScript("return window.navigator.platform");
assertThat(platform).isEqualTo("FreeBSD");
}

}
@@ -0,0 +1,74 @@
// 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.environment.webserver;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;

import com.google.common.base.Splitter;

import org.openqa.selenium.Cookie;
import org.openqa.selenium.remote.http.Contents;
import org.openqa.selenium.remote.http.HttpHandler;
import org.openqa.selenium.remote.http.HttpRequest;
import org.openqa.selenium.remote.http.HttpResponse;

import java.io.UncheckedIOException;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAccessor;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

public class EchoHandler implements HttpHandler {

private static final String EPOCH_START = RFC_1123_DATE_TIME.format(
ZonedDateTime.ofInstant(Instant.ofEpochMilli(0), ZoneId.of("UTC")));
private static final String RESPONSE_STRING =
"<html><head><title>Done</title></head><body>"
+ "<h1>Method: <span id='method'>%s</span></h1>"
+ "<h1>Headers</h1><table id='headers'><tbody>%s</tbody></table>"
+ "<h1>Body:</h1><pre>%s</pre>"
+ "</body></html>";

@Override
public HttpResponse execute(HttpRequest request) throws UncheckedIOException {
HttpResponse response = new HttpResponse();
response.setHeader("Content-Type", "text/html");
//Dont Cache Anything at the browser
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response.setHeader ("Expires", EPOCH_START);

String method = request.getMethod().toString();
String headers = StreamSupport.stream(request.getHeaderNames().spliterator(), false)
.flatMap(name -> StreamSupport.stream(request.getHeaders(name).spliterator(), false)
.map(value -> String.format("<tr><td>%s</td><td>%s</td></tr>", name, value)))
.collect(Collectors.joining(""));
String body = Contents.utf8String(request.getContent());

response.setContent(Contents.string(String.format(RESPONSE_STRING, method, headers, body), UTF_8));

return response;
}
}
Expand Up @@ -47,6 +47,7 @@ public HandlersForTests(String hostname, int port, Path tempPageDir) {

Route route = Route.combine(
Route.get("/basicAuth").to(BasicAuthHandler::new),
Route.get("/echo").to(EchoHandler::new),
Route.get("/cookie").to(CookieHandler::new),
Route.get("/encoding").to(EncodingHandler::new),
Route.matching(req -> req.getUri().startsWith("/generated/")).to(() -> new GeneratedJsTestHandler("/generated")),
Expand Down

0 comments on commit 6849ee6

Please sign in to comment.