Skip to content

Commit 32d519e

Browse files
committed
Escaping "bad chars" and a digit char in the beginning of id or class in css selector
1 parent 3cc704f commit 32d519e

File tree

4 files changed

+20
-16
lines changed

4 files changed

+20
-16
lines changed

java/client/src/org/openqa/selenium/remote/RemoteWebDriver.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -389,19 +389,27 @@ protected List<WebElement> findElements(String by, String using) {
389389
return allElements;
390390
}
391391

392+
static String cssEscape(String using) {
393+
using = using.replaceAll("(['\"\\\\#.:;,!?+<>=~*^$|%&@`{}\\-\\/\\[\\]\\(\\)])", "\\$1");
394+
if (using.length() > 0 && Character.isDigit(using.charAt(0))) {
395+
using = "\\" + Integer.toString(30 + Integer.parseInt(using.substring(0,1))) + " " + using.substring(1);
396+
}
397+
return using;
398+
}
399+
392400
public WebElement findElementById(String using) {
393401
if (getW3CStandardComplianceLevel() == 0) {
394402
return findElement("id", using);
395403
} else {
396-
return findElementByCssSelector("#" + using);
404+
return findElementByCssSelector("#" + cssEscape(using));
397405
}
398406
}
399407

400408
public List<WebElement> findElementsById(String using) {
401409
if (getW3CStandardComplianceLevel() == 0) {
402410
return findElements("id", using);
403411
} else {
404-
return findElementsByCssSelector("#" + using);
412+
return findElementsByCssSelector("#" + cssEscape(using));
405413
}
406414
}
407415

@@ -441,31 +449,31 @@ public WebElement findElementByName(String using) {
441449
if (getW3CStandardComplianceLevel() == 0) {
442450
return findElement("name", using);
443451
} else {
444-
return findElementByCssSelector("*[name=" + using + "]");
452+
return findElementByCssSelector("*[name='" + using + "']");
445453
}
446454
}
447455

448456
public List<WebElement> findElementsByName(String using) {
449457
if (getW3CStandardComplianceLevel() == 0) {
450458
return findElements("name", using);
451459
} else {
452-
return findElementsByCssSelector("*[name=" + using + "]");
460+
return findElementsByCssSelector("*[name='" + using + "']");
453461
}
454462
}
455463

456464
public WebElement findElementByClassName(String using) {
457465
if (getW3CStandardComplianceLevel() == 0) {
458466
return findElement("class name", using);
459467
} else {
460-
return findElementByCssSelector("." + using);
468+
return findElementByCssSelector("." + cssEscape(using));
461469
}
462470
}
463471

464472
public List<WebElement> findElementsByClassName(String using) {
465473
if (getW3CStandardComplianceLevel() == 0) {
466474
return findElements("class name", using);
467475
} else {
468-
return findElementsByCssSelector("." + using);
476+
return findElementsByCssSelector("." + cssEscape(using));
469477
}
470478
}
471479

java/client/src/org/openqa/selenium/remote/RemoteWebElement.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,15 +228,15 @@ public WebElement findElementById(String using) {
228228
if (parent.getW3CStandardComplianceLevel() == 0) {
229229
return findElement("id", using);
230230
} else {
231-
return findElementByCssSelector("#" + using);
231+
return findElementByCssSelector("#" + RemoteWebDriver.cssEscape(using));
232232
}
233233
}
234234

235235
public List<WebElement> findElementsById(String using) {
236236
if (parent.getW3CStandardComplianceLevel() == 0) {
237237
return findElements("id", using);
238238
} else {
239-
return findElementsByCssSelector("#" + using);
239+
return findElementsByCssSelector("#" + RemoteWebDriver.cssEscape(using));
240240
}
241241
}
242242

@@ -252,31 +252,31 @@ public WebElement findElementByName(String using) {
252252
if (parent.getW3CStandardComplianceLevel() == 0) {
253253
return findElement("name", using);
254254
} else {
255-
return findElementByCssSelector("*[name=" + using + "]");
255+
return findElementByCssSelector("*[name='" + using + "']");
256256
}
257257
}
258258

259259
public List<WebElement> findElementsByName(String using) {
260260
if (parent.getW3CStandardComplianceLevel() == 0) {
261261
return findElements("name", using);
262262
} else {
263-
return findElementsByCssSelector("*[name=" + using + "]");
263+
return findElementsByCssSelector("*[name='" + using + "']");
264264
}
265265
}
266266

267267
public WebElement findElementByClassName(String using) {
268268
if (parent.getW3CStandardComplianceLevel() == 0) {
269269
return findElement("class name", using);
270270
} else {
271-
return findElementByCssSelector("." + using);
271+
return findElementByCssSelector("." + RemoteWebDriver.cssEscape(using));
272272
}
273273
}
274274

275275
public List<WebElement> findElementsByClassName(String using) {
276276
if (parent.getW3CStandardComplianceLevel() == 0) {
277277
return findElements("class name", using);
278278
} else {
279-
return findElementsByCssSelector("." + using);
279+
return findElementsByCssSelector("." + RemoteWebDriver.cssEscape(using));
280280
}
281281
}
282282

java/client/test/org/openqa/selenium/ChildrenFindingTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ public void testFindElementsByName() {
109109
}
110110

111111
@Test
112-
@Ignore(MARIONETTE)
113112
public void testFindElementById() {
114113
driver.get(pages.nestedPage);
115114
WebElement element = driver.findElement(By.name("form2"));
@@ -138,7 +137,6 @@ public void testFindElementByIdWhenNoMatchInContext() {
138137
}
139138

140139
@Test
141-
@Ignore(MARIONETTE)
142140
public void testFindElementsById() {
143141
driver.get(pages.nestedPage);
144142
WebElement element = driver.findElement(By.name("form2"));

java/client/test/org/openqa/selenium/ElementFindingTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ public void testShouldBeAbleToFindASingleElementById() {
5555
}
5656

5757
@Test
58-
@Ignore(MARIONETTE)
5958
public void testShouldBeAbleToFindASingleElementByNumericId() {
6059
driver.get(pages.nestedPage);
6160
WebElement element = driver.findElement(By.id("2"));
@@ -70,7 +69,6 @@ public void testShouldBeAbleToFindMultipleElementsById() {
7069
}
7170

7271
@Test
73-
@Ignore(MARIONETTE)
7472
public void testShouldBeAbleToFindMultipleElementsByNumericId() {
7573
driver.get(pages.nestedPage);
7674
List<WebElement> elements = driver.findElements(By.id("2"));

0 commit comments

Comments
 (0)