32
32
import org .openqa .selenium .events .local .GuavaEventBus ;
33
33
import org .openqa .selenium .grid .data .Session ;
34
34
import org .openqa .selenium .grid .node .local .LocalNode ;
35
+ import org .openqa .selenium .grid .node .locators .FallbackLocators ;
35
36
import org .openqa .selenium .grid .security .Secret ;
36
37
import org .openqa .selenium .grid .testing .TestSessionFactory ;
37
38
import org .openqa .selenium .grid .web .ErrorFilter ;
@@ -91,8 +92,7 @@ public void partiallyBuildNode() {
91
92
public void shouldRequireInputToHaveAUsingParameter () {
92
93
Node node = nodeBuilder .build ();
93
94
94
- HttpHandler handler = new org .openqa .selenium .grid .node .CustomLocatorHandler (
95
- node , registrationSecret , emptySet ());
95
+ HttpHandler handler = new CustomLocatorHandler (node , registrationSecret , emptySet ());
96
96
97
97
HttpResponse res = handler .execute (
98
98
new HttpRequest (POST , "/session/1234/element" )
@@ -106,8 +106,7 @@ public void shouldRequireInputToHaveAUsingParameter() {
106
106
public void shouldRequireInputToHaveAValueParameter () {
107
107
Node node = nodeBuilder .build ();
108
108
109
- HttpHandler handler = new org .openqa .selenium .grid .node .CustomLocatorHandler (
110
- node , registrationSecret , emptySet ());
109
+ HttpHandler handler = new CustomLocatorHandler (node , registrationSecret , emptySet ());
111
110
112
111
HttpResponse res = handler .execute (
113
112
new HttpRequest (POST , "/session/1234/element" )
@@ -121,8 +120,7 @@ public void shouldRequireInputToHaveAValueParameter() {
121
120
public void shouldRejectRequestWithAnUnknownLocatorMechanism () {
122
121
Node node = nodeBuilder .build ();
123
122
124
- HttpHandler handler = new org .openqa .selenium .grid .node .CustomLocatorHandler (
125
- node , registrationSecret , emptySet ());
123
+ HttpHandler handler = new CustomLocatorHandler (node , registrationSecret , emptySet ());
126
124
127
125
HttpResponse res = handler .execute (
128
126
new HttpRequest (POST , "/session/1234/element" )
@@ -142,7 +140,7 @@ public void shouldCallTheGivenLocatorForALocator() {
142
140
new TestSessionFactory ((id , c ) -> new Session (id , nodeUri , caps , c , Instant .now ())))
143
141
.build ();
144
142
145
- HttpHandler handler = new org . openqa . selenium . grid . node . CustomLocatorHandler (
143
+ HttpHandler handler = new CustomLocatorHandler (
146
144
node ,
147
145
registrationSecret ,
148
146
singleton (new CustomLocator () {
@@ -183,7 +181,7 @@ public void shouldBeAbleToUseNodeAsWebDriver() {
183
181
.setContent (Contents .asJson (singletonMap (
184
182
"value" , singletonList (singletonMap (Dialect .W3C .getEncodedElementKey (), elementId ))))));
185
183
186
- HttpHandler handler = new org . openqa . selenium . grid . node . CustomLocatorHandler (
184
+ HttpHandler handler = new CustomLocatorHandler (
187
185
node ,
188
186
registrationSecret ,
189
187
singleton (new CustomLocator () {
@@ -249,6 +247,54 @@ public By createBy(Object usingParameter) {
249
247
assertThat (seenId ).isEqualTo (elementId );
250
248
}
251
249
250
+ @ Test
251
+ public void shouldNotFindLocatorStrategyForId () {
252
+ Capabilities caps = new ImmutableCapabilities ("browserName" , "cheesefox" );
253
+ Node node = nodeBuilder .add (
254
+ caps ,
255
+ new TestSessionFactory ((id , c ) -> new Session (id , nodeUri , caps , c , Instant .now ())))
256
+ .build ();
257
+
258
+ HttpHandler handler = new CustomLocatorHandler (node , registrationSecret , emptySet ());
259
+
260
+ HttpResponse res = handler .with (new ErrorFilter ()).execute (
261
+ new HttpRequest (POST , "/session/1234/element" )
262
+ .setContent (Contents .asJson (ImmutableMap .of (
263
+ "using" , "id" ,
264
+ "value" , "tasty" ))));
265
+
266
+ assertThatExceptionOfType (InvalidArgumentException .class ).isThrownBy (() -> Values .get (res , WebElement .class ));
267
+ }
268
+
269
+ @ Test
270
+ public void shouldFallbackToUseById () {
271
+ String elementId = UUID .randomUUID ().toString ();
272
+
273
+ Node node = Mockito .mock (Node .class );
274
+ when (node .executeWebDriverCommand (argThat (matchesUri ("/session/{sessionId}/elements" ))))
275
+ .thenReturn (
276
+ new HttpResponse ()
277
+ .addHeader ("Content-Type" , Json .JSON_UTF_8 )
278
+ .setContent (Contents .asJson (singletonMap (
279
+ "value" , singletonList (singletonMap (Dialect .W3C .getEncodedElementKey (), elementId ))))));
280
+
281
+ HttpHandler handler = new CustomLocatorHandler (
282
+ node ,
283
+ registrationSecret ,
284
+ singleton (new FallbackLocators .ById ()));
285
+
286
+ HttpResponse res = handler .execute (
287
+ new HttpRequest (POST , "/session/1234/elements" )
288
+ .setContent (Contents .asJson (ImmutableMap .of (
289
+ "using" , "id" ,
290
+ "value" , "tasty" ))));
291
+
292
+ List <Map <String , Object >> elements = Values .get (res , new TypeToken <List <Map <String , Object >>>(){}.getType ());
293
+ assertThat (elements ).hasSize (1 );
294
+ Object seenId = elements .get (0 ).get (Dialect .W3C .getEncodedElementKey ());
295
+ assertThat (seenId ).isEqualTo (elementId );
296
+ }
297
+
252
298
private ArgumentMatcher <HttpRequest > matchesUri (String template ) {
253
299
UrlTemplate ut = new UrlTemplate (template );
254
300
0 commit comments