2929import com .thoughtworks .selenium .webdriven .JavascriptLibrary ;
3030import com .thoughtworks .selenium .webdriven .commands .SeleniumSelect ;
3131
32+ import org .openqa .selenium .Keys ;
3233import org .openqa .selenium .WebElement ;
3334import org .openqa .selenium .internal .WrapsDriver ;
3435
@@ -52,6 +53,8 @@ private static ImmutableMap<String, CoreStepFactory> build() {
5253 steps .put ("assertErrorOnNext" , nextCommandFails );
5354 steps .put ("assertFailureOnNext" , nextCommandFails );
5455
56+ steps .put ("sendKeys" , SendKeys ::new );
57+
5558 steps .put (
5659 "verifyErrorOnNext" ,
5760 (locator , value ) -> (selenium , state ) -> new VerifyNextCommandFails (state .expand (locator )));
@@ -196,4 +199,103 @@ public boolean isOkayToContinueTest() {
196199 return true ;
197200 }
198201 }
202+
203+ private static class SendKeys implements CoreStep {
204+
205+ private final String locator ;
206+ private final String value ;
207+
208+ private SendKeys (String locator , String value ) {
209+ this .locator = locator ;
210+ this .value = value ;
211+ }
212+
213+ @ Override
214+ public NextStepDecorator execute (Selenium selenium , TestState state ) {
215+ String value = state .expand (this .value );
216+
217+ value = value .replace ("${KEY_ALT}" , Keys .ALT );
218+ value = value .replace ("${KEY_CONTROL}" , Keys .CONTROL );
219+ value = value .replace ("${KEY_CTRL}" , Keys .CONTROL );
220+ value = value .replace ("${KEY_META}" , Keys .META );
221+ value = value .replace ("${KEY_COMMAND}" , Keys .COMMAND );
222+ value = value .replace ("${KEY_SHIFT}" , Keys .SHIFT );
223+
224+ value = value .replace ("${KEY_BACKSPACE}" , Keys .BACK_SPACE );
225+ value = value .replace ("${KEY_BKSP}" , Keys .BACK_SPACE );
226+ value = value .replace ("${KEY_DELETE}" , Keys .DELETE );
227+ value = value .replace ("${KEY_DEL}" , Keys .DELETE );
228+ value = value .replace ("${KEY_ENTER}" , Keys .ENTER );
229+ value = value .replace ("${KEY_EQUALS}" , Keys .EQUALS );
230+ value = value .replace ("${KEY_ESCAPE}" , Keys .ESCAPE );
231+ value = value .replace ("${KEY_ESC}" , Keys .ESCAPE );
232+ value = value .replace ("${KEY_INSERT}" , Keys .INSERT );
233+ value = value .replace ("${KEY_INS}" , Keys .INSERT );
234+ value = value .replace ("${KEY_PAUSE}" , Keys .PAUSE );
235+ value = value .replace ("${KEY_SEMICOLON}" , Keys .SEMICOLON );
236+ value = value .replace ("${KEY_SPACE}" , Keys .SPACE );
237+ value = value .replace ("${KEY_TAB}" , Keys .TAB );
238+
239+ value = value .replace ("${KEY_LEFT}" , Keys .LEFT );
240+ value = value .replace ("${KEY_UP}" , Keys .UP );
241+ value = value .replace ("${KEY_RIGHT}" , Keys .RIGHT );
242+ value = value .replace ("${KEY_DOWN}" , Keys .DOWN );
243+ value = value .replace ("${KEY_PAGE_UP}" , Keys .PAGE_UP );
244+ value = value .replace ("${KEY_PGUP}" , Keys .PAGE_UP );
245+ value = value .replace ("${KEY_PAGE_DOWN}" , Keys .PAGE_DOWN );
246+ value = value .replace ("${KEY_PGDN}" , Keys .PAGE_DOWN );
247+ value = value .replace ("${KEY_END}" , Keys .END );
248+ value = value .replace ("${KEY_HOME}" , Keys .HOME );
249+
250+ value = value .replace ("${KEY_NUMPAD0}" , Keys .NUMPAD0 );
251+ value = value .replace ("${KEY_N0}" , Keys .NUMPAD0 );
252+ value = value .replace ("${KEY_NUMPAD1}" , Keys .NUMPAD1 );
253+ value = value .replace ("${KEY_N1}" , Keys .NUMPAD1 );
254+ value = value .replace ("${KEY_NUMPAD2}" , Keys .NUMPAD2 );
255+ value = value .replace ("${KEY_N2}" , Keys .NUMPAD2 );
256+ value = value .replace ("${KEY_NUMPAD3}" , Keys .NUMPAD3 );
257+ value = value .replace ("${KEY_N3}" , Keys .NUMPAD3 );
258+ value = value .replace ("${KEY_NUMPAD4}" , Keys .NUMPAD4 );
259+ value = value .replace ("${KEY_N4}" , Keys .NUMPAD4 );
260+ value = value .replace ("${KEY_NUMPAD5}" , Keys .NUMPAD5 );
261+ value = value .replace ("${KEY_N5}" , Keys .NUMPAD5 );
262+ value = value .replace ("${KEY_NUMPAD6}" , Keys .NUMPAD6 );
263+ value = value .replace ("${KEY_N6}" , Keys .NUMPAD6 );
264+ value = value .replace ("${KEY_NUMPAD7}" , Keys .NUMPAD7 );
265+ value = value .replace ("${KEY_N7}" , Keys .NUMPAD7 );
266+ value = value .replace ("${KEY_NUMPAD8}" , Keys .NUMPAD8 );
267+ value = value .replace ("${KEY_N8}" , Keys .NUMPAD8 );
268+ value = value .replace ("${KEY_NUMPAD9}" , Keys .NUMPAD9 );
269+ value = value .replace ("${KEY_N9}" , Keys .NUMPAD9 );
270+ value = value .replace ("${KEY_ADD}" , Keys .ADD );
271+ value = value .replace ("${KEY_NUM_PLUS}" , Keys .ADD );
272+ value = value .replace ("${KEY_DECIMAL}" , Keys .DECIMAL );
273+ value = value .replace ("${KEY_NUM_PERIOD}" , Keys .DECIMAL );
274+ value = value .replace ("${KEY_DIVIDE}" , Keys .DIVIDE );
275+ value = value .replace ("${KEY_NUM_DIVISION}" , Keys .DIVIDE );
276+ value = value .replace ("${KEY_MULTIPLY}" , Keys .MULTIPLY );
277+ value = value .replace ("${KEY_NUM_MULTIPLY}" , Keys .MULTIPLY );
278+ value = value .replace ("${KEY_SEPARATOR}" , Keys .SEPARATOR );
279+ value = value .replace ("${KEY_SEP}" , Keys .SEPARATOR );
280+ value = value .replace ("${KEY_SUBTRACT}" , Keys .SUBTRACT );
281+ value = value .replace ("${KEY_NUM_MINUS}" , Keys .SUBTRACT );
282+
283+ value = value .replace ("${KEY_F1}" , Keys .F1 );
284+ value = value .replace ("${KEY_F2}" , Keys .F2 );
285+ value = value .replace ("${KEY_F3}" , Keys .F3 );
286+ value = value .replace ("${KEY_F4}" , Keys .F4 );
287+ value = value .replace ("${KEY_F5}" , Keys .F5 );
288+ value = value .replace ("${KEY_F6}" , Keys .F6 );
289+ value = value .replace ("${KEY_F7}" , Keys .F7 );
290+ value = value .replace ("${KEY_F8}" , Keys .F8 );
291+ value = value .replace ("${KEY_F9}" , Keys .F9 );
292+ value = value .replace ("${KEY_F10}" , Keys .F10 );
293+ value = value .replace ("${KEY_F11}" , Keys .F11 );
294+ value = value .replace ("${KEY_F12}" , Keys .F12 );
295+
296+ selenium .typeKeys (locator , value );
297+
298+ return NextStepDecorator .IDENTITY ;
299+ }
300+ }
199301}
0 commit comments