Skip to content

Commit 26a8502

Browse files
committed
Add ExpectedConditions.urlFulfills
1 parent f8396b9 commit 26a8502

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

java/src/org/openqa/selenium/support/ui/ExpectedConditions.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818
package org.openqa.selenium.support.ui;
1919

2020
import com.google.common.base.Joiner;
21+
import java.net.URI;
22+
import java.net.URISyntaxException;
2123
import java.util.Arrays;
2224
import java.util.List;
2325
import java.util.Optional;
26+
import java.util.function.Predicate;
2427
import java.util.regex.Pattern;
2528
import org.openqa.selenium.Alert;
2629
import org.openqa.selenium.By;
@@ -157,6 +160,35 @@ public String toString() {
157160
};
158161
}
159162

163+
/**
164+
* An expectation for checking that the current URL fulfills a given predicate.
165+
*
166+
* @param predicate a predicate that tests a URI and returns true if the condition is satisfied
167+
* @return true when the predicate applied to the current URL returns true, false otherwise
168+
*/
169+
public static ExpectedCondition<Boolean> urlFulfills(Predicate<URI> predicate) {
170+
return new ExpectedCondition<Boolean>() {
171+
private String currentUrl = "";
172+
173+
@Override
174+
public Boolean apply(WebDriver driver) {
175+
currentUrl = driver.getCurrentUrl();
176+
try {
177+
URI uri = new URI(currentUrl);
178+
return predicate.test(uri);
179+
} catch (URISyntaxException e) {
180+
return false;
181+
}
182+
}
183+
184+
@Override
185+
public String toString() {
186+
return String.format(
187+
"url to apply a predicate. Current url: \"%s\"", currentUrl);
188+
}
189+
};
190+
}
191+
160192
/**
161193
* An expectation for checking that an element is present on the DOM of a page. This does not
162194
* necessarily mean that the element is visible.

java/test/org/openqa/selenium/support/ui/ExpectedConditionsTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static org.openqa.selenium.support.ui.ExpectedConditions.textToBePresentInElement;
4747
import static org.openqa.selenium.support.ui.ExpectedConditions.textToBePresentInElementLocated;
4848
import static org.openqa.selenium.support.ui.ExpectedConditions.urlContains;
49+
import static org.openqa.selenium.support.ui.ExpectedConditions.urlFulfills;
4950
import static org.openqa.selenium.support.ui.ExpectedConditions.urlMatches;
5051
import static org.openqa.selenium.support.ui.ExpectedConditions.urlToBe;
5152
import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOf;
@@ -54,6 +55,7 @@
5455
import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfNestedElementsLocatedBy;
5556

5657
import com.google.common.collect.Sets;
58+
import java.net.URI;
5759
import java.time.Duration;
5860
import java.time.Instant;
5961
import java.util.ArrayList;
@@ -157,6 +159,43 @@ void negative_waitingForUrlToBeOpened_urlMatches() {
157159
.isThrownBy(() -> wait.until(urlMatches(".*\\/malformed.*")));
158160
}
159161

162+
@Test
163+
void waitingForUrlToBeOpened_urlFulfills() {
164+
final String url = "https://example.com:8080/path";
165+
when(mockDriver.getCurrentUrl()).thenReturn(url);
166+
167+
wait.until(urlFulfills(uri -> "https".equals(uri.getScheme())));
168+
wait.until(urlFulfills(uri -> "example.com".equals(uri.getHost())));
169+
wait.until(urlFulfills(uri -> uri.getPort() == 8080));
170+
wait.until(urlFulfills(uri -> "/path".equals(uri.getPath())));
171+
}
172+
173+
@Test
174+
void waitingForUrlToBeOpened_urlFulfills_withAbsoluteUrl() {
175+
final String url = "https://example.com/absolute/path";
176+
when(mockDriver.getCurrentUrl()).thenReturn(url);
177+
178+
wait.until(urlFulfills(URI::isAbsolute));
179+
}
180+
181+
@Test
182+
void negative_waitingForUrlToBeOpened_urlFulfills() {
183+
final String url = "http://example.com/path";
184+
when(mockDriver.getCurrentUrl()).thenReturn(url);
185+
186+
assertThatExceptionOfType(TimeoutException.class)
187+
.isThrownBy(() -> wait.until(urlFulfills(uri -> "https".equals(uri.getScheme()))));
188+
}
189+
190+
@Test
191+
void negative_waitingForUrlToBeOpened_urlFulfills_malformedUrl() {
192+
final String url = "not-a-valid-url";
193+
when(mockDriver.getCurrentUrl()).thenReturn(url);
194+
195+
assertThatExceptionOfType(TimeoutException.class)
196+
.isThrownBy(() -> wait.until(urlFulfills(URI::isAbsolute)));
197+
}
198+
160199
@Test
161200
void waitingForVisibilityOfElement_elementAlreadyVisible() {
162201
when(mockElement.isDisplayed()).thenReturn(true);

0 commit comments

Comments
 (0)