diff --git a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitAlert.java b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitAlert.java index 27198c6f..cb3414af 100644 --- a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitAlert.java +++ b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitAlert.java @@ -44,7 +44,7 @@ public class HtmlUnitAlert implements Alert { private final HtmlUnitDriver driver_; private AlertHolder holder_; - private boolean quitting_; + private boolean autoDismissOnQuit; private final Lock lock_ = new ReentrantLock(); private final Condition condition_ = lock_.newCondition(); private WebWindow webWindow_; @@ -60,7 +60,7 @@ public class HtmlUnitAlert implements Alert { } private void alertHandler(final Page page, final String message) { - if (quitting_) { + if (autoDismissOnQuit) { return; } webWindow_ = page.getEnclosingWindow(); @@ -69,7 +69,7 @@ private void alertHandler(final Page page, final String message) { } private boolean confirmHandler(final Page page, final String message) { - if (quitting_) { + if (autoDismissOnQuit) { return false; } webWindow_ = page.getEnclosingWindow(); @@ -83,12 +83,7 @@ private void awaitCondition() { lock_.lock(); try { if (driver_.isProcessAlert()) { - try { - condition_.await(5, TimeUnit.SECONDS); - } - catch (final InterruptedException e) { - throw new RuntimeException(e); - } + waitFor(5); } } finally { @@ -96,8 +91,17 @@ private void awaitCondition() { } } + private void waitFor(int time) { + try { + condition_.await(time, TimeUnit.SECONDS); + } + catch (final InterruptedException e) { + throw new RuntimeException(e); + } + } + private String promptHandler(final Page page, final String message, final String defaultMessage) { - if (quitting_) { + if (autoDismissOnQuit) { return null; } webWindow_ = page.getEnclosingWindow(); @@ -108,7 +112,7 @@ private String promptHandler(final Page page, final String message, final String } private boolean onbeforeunloadHandler(final Page page, final String returnValue) { - if (quitting_) { + if (autoDismissOnQuit) { return true; } webWindow_ = page.getEnclosingWindow(); @@ -123,7 +127,7 @@ WebWindow getWebWindow() { } public void setAutoAccept(final boolean autoAccept) { - this.quitting_ = autoAccept; + this.autoDismissOnQuit = autoAccept; } public void handleBrowserCapabilities(final Capabilities capabilities) { diff --git a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitElementFinder.java b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitElementFinder.java index 285c510e..90b95abf 100644 --- a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitElementFinder.java +++ b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitElementFinder.java @@ -124,7 +124,7 @@ public List findElements(final HtmlUnitDriver driver, final By locat } final List allElements = ((HtmlPage) lastPage).getElementsById(getValue(locator)); - return convertRawDomElementsToWebElements(driver, allElements); + return HtmlUnitElementUtils.convertRawDomElementsToWebElements(driver, allElements); } @Override @@ -150,7 +150,7 @@ public List findElements(final HtmlUnitDriver driver, final By locat } final List allElements = ((HtmlPage) lastPage).getElementsByName(getValue(locator)); - return convertRawDomElementsToWebElements(driver, allElements); + return HtmlUnitElementUtils.convertRawDomElementsToWebElements(driver, allElements); } @Override @@ -489,7 +489,7 @@ public WebElement findElement(final HtmlUnitWebElement element, final By locator // selector is therefore // invalid throw new InvalidSelectorException( - String.format(INVALIDSELECTIONERROR, value, node.getClass().toString())); + String.format(INVALIDSELECTIONERROR, value, node.getClass())); } @Override @@ -515,7 +515,7 @@ public List findElements(final HtmlUnitWebElement element, final By // selector is // therefore invalid throw new InvalidSelectorException( - String.format(INVALIDSELECTIONERROR, value, e.getClass().toString())); + String.format(INVALIDSELECTIONERROR, value, e.getClass())); } } return toReturn; @@ -565,14 +565,18 @@ protected static String getValue(final By locator) { } } - private static List convertRawDomElementsToWebElements( - final HtmlUnitDriver driver, final List nodes) { - final List toReturn = new ArrayList<>(nodes.size()); + public static class HtmlUnitElementUtils{ - for (final DomElement node : nodes) { - toReturn.add(driver.toWebElement(node)); + public static List convertRawDomElementsToWebElements( + final HtmlUnitDriver driver, final List nodes) { + final List toReturn = new ArrayList<>(nodes.size()); + + for (final DomElement node : nodes) { + toReturn.add(driver.toWebElement(node)); + } + + return toReturn; } - return toReturn; } } diff --git a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitTargetLocator.java b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitTargetLocator.java index 3e72eb3d..adde76a3 100644 --- a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitTargetLocator.java +++ b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitTargetLocator.java @@ -187,12 +187,14 @@ public WebElement activeElement() { @Override public Alert alert() { final HtmlUnitAlert alert = driver_.getAlert(); + final int SLEEP_TIME = 50; + final int NUMBER_OF_TRIES = 5; if (!alert.isLocked()) { - for (int i = 0; i < 5; i++) { + for (int i = 0; i < NUMBER_OF_TRIES; i++) { if (!alert.isLocked()) { try { - Thread.sleep(50); + Thread.sleep(SLEEP_TIME); } catch (final InterruptedException e) { throw new RuntimeException(e); @@ -208,13 +210,18 @@ public Alert alert() { final WebWindow alertWindow = alert.getWebWindow(); final WebWindow currentWindow = driver_.getCurrentWindow().getWebWindow(); - if (alertWindow != currentWindow && !isChild(currentWindow, alertWindow) - && !isChild(alertWindow, currentWindow)) { + if (isAlertTimedOut(alertWindow , currentWindow)) { throw new TimeoutException(); } + return alert; } + private static boolean isAlertTimedOut(WebWindow alertWindow , WebWindow currentWindow) { + return (alertWindow != currentWindow && !isChild(currentWindow, alertWindow) + && !isChild(alertWindow, currentWindow)); + } + private static boolean isChild(final WebWindow parent, final WebWindow potentialChild) { for (WebWindow child = potentialChild; child != null; child = child.getParentWindow()) { if (child == parent) { diff --git a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitWebElement.java b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitWebElement.java index 8d1b7763..e3210503 100644 --- a/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitWebElement.java +++ b/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitWebElement.java @@ -81,13 +81,6 @@ */ public class HtmlUnitWebElement implements WrapsDriver, WebElement, Coordinates, Locatable { - private static final String[] booleanAttributes = {"async", "autofocus", "autoplay", "checked", "compact", - "complete", "controls", "declare", "defaultchecked", "defaultselected", "defer", "disabled", "draggable", - "ended", "formnovalidate", "hidden", "indeterminate", "iscontenteditable", "ismap", "itemscope", "loop", - "multiple", "muted", "nohref", "noresize", "noshade", "novalidate", "nowrap", "open", "paused", "pubdate", - "readonly", "required", "reversed", "scoped", "seamless", "seeking", "selected", "spellcheck", "truespeed", - "willvalidate"}; - private final HtmlUnitDriver driver_; private final int id_; private final DomElement element_; @@ -255,7 +248,7 @@ void switchFocusToThisIfNeeded() { final boolean jsEnabled = driver_.isJavascriptEnabled(); final boolean oldActiveEqualsCurrent = oldActiveElement.equals(this); try { - final boolean isBody = oldActiveElement.getTagName().toLowerCase().equals("body"); + final boolean isBody = oldActiveElement.getTagName().equalsIgnoreCase("body"); if (jsEnabled && !oldActiveEqualsCurrent && !isBody) { oldActiveElement.element_.blur(); } @@ -285,6 +278,12 @@ public String getAttribute(final String name) { assertElementNotStale(); final String lowerName = name.toLowerCase(); + final String[] booleanAttributes = {"async", "autofocus", "autoplay", "checked", "compact", + "complete", "controls", "declare", "defaultchecked", "defaultselected", "defer", "disabled", "draggable", + "ended", "formnovalidate", "hidden", "indeterminate", "iscontenteditable", "ismap", "itemscope", "loop", + "multiple", "muted", "nohref", "noresize", "noshade", "novalidate", "nowrap", "open", "paused", "pubdate", + "readonly", "required", "reversed", "scoped", "seamless", "seeking", "selected", "spellcheck", "truespeed", + "willvalidate"}; if (element_ instanceof HtmlInput && ("selected".equals(lowerName) || "checked".equals(lowerName))) { return trueOrNull(((HtmlInput) element_).isChecked()); @@ -410,21 +409,11 @@ public String getDomProperty(final String name) { return ScriptRuntime.toCharSequence(ScriptableObject.getProperty(scriptable, lowerName)).toString(); } - // js disabled, fallback to some hacks - if ("disabled".equals(lowerName)) { - if (element_ instanceof DisabledElement) { - return trueOrFalse(((DisabledElement) element_).isDisabled()); - } - } + String element_1 = disabledJsCheck(lowerName); + if (element_1 != null) return element_1; - if ("checked".equals(lowerName)) { - if (element_ instanceof HtmlCheckBoxInput) { - return trueOrFalse(((HtmlCheckBoxInput) element_).isChecked()); - } - else if (element_ instanceof HtmlRadioButtonInput) { - return trueOrFalse(((HtmlRadioButtonInput) element_).isChecked()); - } - } + String element_2 = isElementChecked(lowerName); + if (element_2 != null) return element_2; final String value = element_.getAttribute(lowerName); if (ATTRIBUTE_NOT_DEFINED == value) { @@ -438,6 +427,27 @@ else if (element_ instanceof HtmlRadioButtonInput) { return value; } + private String isElementChecked(String lowerName) { + if ("checked".equals(lowerName)) { + if (element_ instanceof HtmlCheckBoxInput) { + return trueOrFalse(((HtmlCheckBoxInput) element_).isChecked()); + } + else if (element_ instanceof HtmlRadioButtonInput) { + return trueOrFalse(((HtmlRadioButtonInput) element_).isChecked()); + } + } + return null; + } + + private String disabledJsCheck(String lowerName) { + if ("disabled".equals(lowerName)) { + if (element_ instanceof DisabledElement) { + return trueOrFalse(((DisabledElement) element_).isDisabled()); + } + } + return null; + } + @Override public String getDomAttribute(final String name) { assertElementNotStale(); diff --git a/src/test/java/org/openqa/selenium/htmlunit/junit/BrowserRunner.java b/src/test/java/org/openqa/selenium/htmlunit/junit/BrowserRunner.java index ecae580a..b1e55a01 100644 --- a/src/test/java/org/openqa/selenium/htmlunit/junit/BrowserRunner.java +++ b/src/test/java/org/openqa/selenium/htmlunit/junit/BrowserRunner.java @@ -89,7 +89,7 @@ public class BrowserRunner extends Suite { * @throws Throwable If an exception occurs */ public BrowserRunner(final Class klass) throws Throwable { - super(klass, Collections.emptyList()); + super(klass, Collections.emptyList()); if (BrowserVersionClassRunner.containsTestMethods(klass)) { final Set browsers = WebDriverTestCase.getBrowsersProperties();