Skip to content

Commit 92e0438

Browse files
asashourlukeis
authored andcommitted
HtmlUnitWebElement: to handle DomElement
Currently HtmlUnitWebElement supports only HtmlElement, however there are potential SvgElement which should be handled. This is the first step towards implementing SvgElement clicking, as required by Selenium test suite. Signed-off-by: Luke Inman-Semerau <[email protected]>
1 parent bb7e418 commit 92e0438

File tree

2 files changed

+28
-27
lines changed

2 files changed

+28
-27
lines changed

Diff for: java/client/src/org/openqa/selenium/htmlunit/HtmlUnitDriver.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ private Object parseArgumentIntoJavascriptParameter(
780780
}
781781
}
782782

783-
protected void assertElementNotStale(HtmlElement element) {
783+
protected void assertElementNotStale(DomElement element) {
784784
SgmlPage elementPage = element.getPage();
785785
Page currentPage = lastPage();
786786

@@ -963,7 +963,7 @@ public WebElement findElementByLinkText(String selector) {
963963
throw new NoSuchElementException("No link found with text: " + expectedText);
964964
}
965965

966-
protected WebElement newHtmlUnitWebElement(HtmlElement element) {
966+
protected WebElement newHtmlUnitWebElement(DomElement element) {
967967
return new HtmlUnitWebElement(this, element);
968968
}
969969

@@ -1034,11 +1034,11 @@ public WebElement findElementByCssSelector(String using) {
10341034
throw new NoSuchElementException("Unable to locate element using css", ex);
10351035
}
10361036

1037-
if (node instanceof HtmlElement) {
1038-
return newHtmlUnitWebElement((HtmlElement) node);
1037+
if (node instanceof DomElement) {
1038+
return newHtmlUnitWebElement((DomElement) node);
10391039
}
10401040

1041-
throw new NoSuchElementException("Returned node was not an HTML element");
1041+
throw new NoSuchElementException("Returned node was not a DOM element");
10421042
}
10431043

10441044
@Override
@@ -1058,10 +1058,10 @@ public List<WebElement> findElementsByCssSelector(String using) {
10581058
List<WebElement> toReturn = new ArrayList<>();
10591059

10601060
for (DomNode node : allNodes) {
1061-
if (node instanceof HtmlElement) {
1062-
toReturn.add(newHtmlUnitWebElement((HtmlElement) node));
1061+
if (node instanceof DomElement) {
1062+
toReturn.add(newHtmlUnitWebElement((DomElement) node));
10631063
} else {
1064-
throw new NoSuchElementException("Returned node was not an HTML element");
1064+
throw new NoSuchElementException("Returned node was not a DOM element");
10651065
}
10661066
}
10671067

@@ -1240,7 +1240,7 @@ public WebDriver frame(final String nameOrId) {
12401240
try {
12411241
HtmlUnitWebElement element =
12421242
(HtmlUnitWebElement) HtmlUnitDriver.this.findElementById(nameOrId);
1243-
HtmlElement domElement = element.getElement();
1243+
DomElement domElement = element.getElement();
12441244
if (domElement instanceof BaseFrameElement) {
12451245
currentWindow = ((BaseFrameElement) domElement).getEnclosedWindow();
12461246
return HtmlUnitDriver.this;
@@ -1260,7 +1260,7 @@ public WebDriver frame(WebElement frameElement) {
12601260
HtmlUnitWebElement webElement = (HtmlUnitWebElement) frameElement;
12611261
webElement.assertElementNotStale();
12621262

1263-
HtmlElement domElement = webElement.getElement();
1263+
DomElement domElement = webElement.getElement();
12641264
if (!(domElement instanceof BaseFrameElement)) {
12651265
throw new NoSuchFrameException(webElement.getTagName() + " is not a frame element.");
12661266
}

Diff for: java/client/src/org/openqa/selenium/htmlunit/HtmlUnitWebElement.java

+18-17
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
import java.util.List;
2626
import java.util.concurrent.Callable;
2727

28-
import net.sourceforge.htmlunit.corejs.javascript.Undefined;
29-
3028
import org.openqa.selenium.By;
3129
import org.openqa.selenium.Dimension;
3230
import org.openqa.selenium.ElementNotVisibleException;
@@ -52,6 +50,7 @@
5250
import org.w3c.dom.NamedNodeMap;
5351

5452
import com.gargoylesoftware.htmlunit.ScriptResult;
53+
import com.gargoylesoftware.htmlunit.html.DomElement;
5554
import com.gargoylesoftware.htmlunit.html.DomNode;
5655
import com.gargoylesoftware.htmlunit.html.DomText;
5756
import com.gargoylesoftware.htmlunit.html.HtmlButton;
@@ -71,13 +70,15 @@
7170
import com.google.common.base.Strings;
7271
import com.google.common.base.Throwables;
7372

73+
import net.sourceforge.htmlunit.corejs.javascript.Undefined;
74+
7475

7576
public class HtmlUnitWebElement implements WrapsDriver,
7677
FindsById, FindsByLinkText, FindsByXPath, FindsByTagName,
7778
FindsByCssSelector, Locatable, WebElement {
7879

7980
protected final HtmlUnitDriver parent;
80-
protected final HtmlElement element;
81+
protected final DomElement element;
8182
private static final char nbspChar = 160;
8283
private static final String[] blockLevelsTagNames =
8384
{"p", "h1", "h2", "h3", "h4", "h5", "h6", "dl", "div", "noscript",
@@ -128,7 +129,7 @@ public class HtmlUnitWebElement implements WrapsDriver,
128129

129130
private String toString;
130131

131-
public HtmlUnitWebElement(HtmlUnitDriver parent, HtmlElement element) {
132+
public HtmlUnitWebElement(HtmlUnitDriver parent, DomElement element) {
132133
this.parent = parent;
133134
this.element = element;
134135
}
@@ -166,10 +167,10 @@ public void submit() {
166167
submitForm((HtmlForm) element);
167168
return;
168169
} else if ((element instanceof HtmlSubmitInput) || (element instanceof HtmlImageInput)) {
169-
element.click();
170+
((HtmlElement) element).click();
170171
return;
171172
} else if (element instanceof HtmlInput) {
172-
HtmlForm form = element.getEnclosingForm();
173+
HtmlForm form = ((HtmlElement) element).getEnclosingForm();
173174
if (form == null) {
174175
throw new NoSuchElementException("Unable to find the containing form");
175176
}
@@ -297,12 +298,12 @@ private void switchFocusToThisIfNeeded() {
297298
if (jsEnabled &&
298299
!oldActiveEqualsCurrent &&
299300
!isBody) {
300-
oldActiveElement.element.blur();
301+
((HtmlElement) oldActiveElement.element).blur();
301302
}
302303
} catch (StaleElementReferenceException ex) {
303304
// old element has gone, do nothing
304305
}
305-
element.focus();
306+
((HtmlElement) element).focus();
306307
}
307308

308309
void sendKeyDownEvent(CharSequence modifierKey) {
@@ -317,7 +318,7 @@ private void sendSingleKeyEvent(CharSequence modifierKey, String eventDescriptio
317318
verifyCanInteractWithElement();
318319
switchFocusToThisIfNeeded();
319320
HtmlUnitKeyboard keyboard = (HtmlUnitKeyboard) parent.getKeyboard();
320-
keyboard.performSingleKeyAction(getElement(), modifierKey, eventDescription);
321+
keyboard.performSingleKeyAction((HtmlElement) getElement(), modifierKey, eventDescription);
321322
}
322323

323324
@Override
@@ -329,7 +330,7 @@ public void sendKeys(CharSequence... value) {
329330
switchFocusToThisIfNeeded();
330331

331332
HtmlUnitKeyboard keyboard = (HtmlUnitKeyboard) parent.getKeyboard();
332-
keyboard.sendKeys(element, getAttribute("value"), keysContainer);
333+
keyboard.sendKeys((HtmlElement) element, getAttribute("value"), keysContainer);
333334

334335
if (isInputElement() && keysContainer.wasSubmitKeyFound()) {
335336
submit();
@@ -540,7 +541,7 @@ protected HtmlUnitDriver getParent() {
540541
return parent;
541542
}
542543

543-
protected HtmlElement getElement() {
544+
protected DomElement getElement() {
544545
return element;
545546
}
546547

@@ -685,7 +686,7 @@ private List<WebElement> findChildNodes(List<WebElement> allElements) {
685686
List<WebElement> toReturn = new LinkedList<WebElement>();
686687

687688
for (WebElement current : allElements) {
688-
HtmlElement candidate = ((HtmlUnitWebElement) current).element;
689+
DomElement candidate = ((HtmlUnitWebElement) current).element;
689690
if (element.isAncestorOf(candidate) && element != candidate) {
690691
toReturn.add(current);
691692
}
@@ -765,9 +766,9 @@ public List<WebElement> findElementsByLinkText(String linkText) {
765766
assertElementNotStale();
766767

767768
String expectedText = linkText.trim();
768-
List<? extends HtmlElement> htmlElements = element.getHtmlElementsByTagName("a");
769+
List<? extends DomElement> htmlElements = ((HtmlElement) element).getHtmlElementsByTagName("a");
769770
List<WebElement> webElements = new ArrayList<>();
770-
for (HtmlElement e : htmlElements) {
771+
for (DomElement e : htmlElements) {
771772
if (expectedText.equals(e.getTextContent().trim()) && e.getAttribute("href") != null) {
772773
webElements.add(getParent().newHtmlUnitWebElement(e));
773774
}
@@ -791,7 +792,7 @@ public WebElement findElementByPartialLinkText(String linkText) {
791792
public List<WebElement> findElementsByPartialLinkText(String linkText) {
792793
assertElementNotStale();
793794

794-
List<? extends HtmlElement> htmlElements = element.getHtmlElementsByTagName("a");
795+
List<? extends HtmlElement> htmlElements = ((HtmlElement) element).getHtmlElementsByTagName("a");
795796
List<WebElement> webElements = new ArrayList<>();
796797
for (HtmlElement e : htmlElements) {
797798
if (e.getTextContent().contains(linkText)
@@ -817,7 +818,7 @@ public WebElement findElementByTagName(String name) {
817818
public List<WebElement> findElementsByTagName(String name) {
818819
assertElementNotStale();
819820

820-
List<HtmlElement> elements = element.getHtmlElementsByTagName(name);
821+
List<HtmlElement> elements = ((HtmlElement) element).getHtmlElementsByTagName(name);
821822
List<WebElement> toReturn = new ArrayList<>(elements.size());
822823
for (HtmlElement element : elements) {
823824
toReturn.add(parent.newHtmlUnitWebElement(element));
@@ -864,7 +865,7 @@ protected void assertElementNotStale() {
864865
public String getCssValue(String propertyName) {
865866
assertElementNotStale();
866867

867-
return getEffectiveStyle(element, propertyName);
868+
return getEffectiveStyle((HtmlElement) element, propertyName);
868869
}
869870

870871
private String getEffectiveStyle(HtmlElement htmlElement, String propertyName) {

0 commit comments

Comments
 (0)