Skip to content

Commit 6da62ec

Browse files
committed
Making keyboard interactions to retain selection. Fixes issue 2779
1 parent aa34ecd commit 6da62ec

File tree

3 files changed

+82
-6
lines changed

3 files changed

+82
-6
lines changed

java/client/test/org/openqa/selenium/interactions/BasicKeyboardInterfaceTest.java

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void testSendingKeyDownOnly() {
8686
releaseShift.perform();
8787

8888
assertTrue("Key down event not isolated, got: " + logText,
89-
logText.endsWith("keydown"));
89+
logText.endsWith("keydown"));
9090
}
9191

9292
@JavascriptEnabled
@@ -200,6 +200,77 @@ public void canGenerateKeyboardShortcuts() {
200200
assertBackgroundColor(body, Colors.SILVER);
201201
}
202202

203+
@Test
204+
@Ignore({HTMLUNIT, OPERA, OPERA_MOBILE})
205+
public void testSelectionSelectBySymbol() {
206+
driver.get(pages.javascriptPage);
207+
208+
WebElement keyReporter = driver.findElement(By.id("keyReporter"));
209+
210+
getBuilder(driver).click(keyReporter).sendKeys("abc def").perform();
211+
assertThat(keyReporter.getAttribute("value"), is("abc def"));
212+
213+
getBuilder(driver).click(keyReporter)
214+
.keyDown(Keys.SHIFT)
215+
.sendKeys(Keys.LEFT)
216+
.sendKeys(Keys.LEFT)
217+
.keyUp(Keys.SHIFT)
218+
.sendKeys(Keys.DELETE)
219+
.perform();
220+
221+
assertThat(keyReporter.getAttribute("value"), is("abc d"));
222+
}
223+
224+
@Test
225+
@Ignore({HTMLUNIT, IE, OPERA, OPERA_MOBILE})
226+
public void testSelectionSelectByWord() {
227+
assumeTrue(
228+
"Test fails with native events enabled, likely due to issue 4385",
229+
!TestUtilities.isFirefox(driver) || !TestUtilities.isNativeEventsEnabled(driver));
230+
231+
driver.get(pages.javascriptPage);
232+
233+
WebElement keyReporter = driver.findElement(By.id("keyReporter"));
234+
235+
getBuilder(driver).click(keyReporter).sendKeys("abc def").perform();
236+
assertThat(keyReporter.getAttribute("value"), is("abc def"));
237+
238+
getBuilder(driver).click(keyReporter)
239+
.keyDown(Keys.SHIFT)
240+
.keyDown(Keys.CONTROL)
241+
.sendKeys(Keys.LEFT)
242+
.keyUp(Keys.CONTROL)
243+
.keyUp(Keys.SHIFT)
244+
.sendKeys(Keys.DELETE)
245+
.perform();
246+
247+
assertThat(keyReporter.getAttribute("value"), is("abc "));
248+
}
249+
250+
@Test
251+
@Ignore({HTMLUNIT, IE, OPERA, OPERA_MOBILE})
252+
public void testSelectionSelectAll() {
253+
assumeTrue(
254+
"Test fails with native events enabled, likely due to issue 4385",
255+
!TestUtilities.isFirefox(driver) || !TestUtilities.isNativeEventsEnabled(driver));
256+
257+
driver.get(pages.javascriptPage);
258+
259+
WebElement keyReporter = driver.findElement(By.id("keyReporter"));
260+
261+
getBuilder(driver).click(keyReporter).sendKeys("abc def").perform();
262+
assertThat(keyReporter.getAttribute("value"), is("abc def"));
263+
264+
getBuilder(driver).click(keyReporter)
265+
.keyDown(Keys.CONTROL)
266+
.sendKeys("a")
267+
.keyUp(Keys.CONTROL)
268+
.sendKeys(Keys.DELETE)
269+
.perform();
270+
271+
assertThat(keyReporter.getAttribute("value"), is(""));
272+
}
273+
203274
private void assertBackgroundColor(WebElement el, Colors expected) {
204275
Color actual = Color.fromString(el.getCssValue("background-color"));
205276
assertThat(actual, is(expected.getColorValue()));

javascript/firefox-driver/js/firefoxDriver.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,11 @@ FirefoxDriver.prototype.mouseClick = function(respond, parameters) {
13331333

13341334
Utils.waitForNativeEventsProcessing(elementForNode, Utils.getNativeEvents(), dummyIndicator, this.jsTimer);
13351335

1336+
if (bot.dom.isEditable(elementForNode) && elementForNode.value !== undefined) {
1337+
goog.dom.selection.setCursorPosition(
1338+
elementForNode, elementForNode.value.length);
1339+
}
1340+
13361341
} else {
13371342
throw generateErrorForNativeEvents(this.enableNativeEvents, nativeMouse, node);
13381343
}
@@ -1383,11 +1388,6 @@ FirefoxDriver.prototype.sendKeysToActiveElement = function(respond, parameters)
13831388

13841389
var currentlyActiveElement = Utils.getActiveElement(respond.session.getDocument());
13851390

1386-
if (bot.dom.isEditable(currentlyActiveElement) && currentlyActiveElement.value !== undefined) {
1387-
goog.dom.selection.setCursorPosition(
1388-
currentlyActiveElement, currentlyActiveElement.value.length);
1389-
}
1390-
13911391
var useElement = currentlyActiveElement;
13921392
var tagName = useElement.tagName.toLowerCase();
13931393
if (tagName == 'body' && useElement.ownerDocument.defaultView.frameElement) {

javascript/firefox-driver/js/syntheticMouse.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,11 @@ SyntheticMouse.prototype.click = function(target) {
207207

208208
bot.action.click(element, this.lastMousePosition, new bot.Mouse(null, keyboardState));
209209

210+
if (bot.dom.isEditable(element) && element.value !== undefined) {
211+
goog.dom.selection.setCursorPosition(
212+
element, element.value.length);
213+
}
214+
210215
this.lastElement = element;
211216

212217
return SyntheticMouse.newResponse(bot.ErrorCode.SUCCESS, 'ok');

0 commit comments

Comments
 (0)