From c4a8fc16ec943cad9d2fc35aa9271dadf63a6fc7 Mon Sep 17 00:00:00 2001 From: John Smart Date: Thu, 4 Feb 2016 15:06:06 +0000 Subject: [PATCH] Refactoring and performance improvements --- .../serenitybdd/core/pages/PageObject.java | 15 ++++++- .../core/pages/WebElementFacadeImpl.java | 41 +++++++++++++++---- .../WebElementFacadeListItemHandler.java | 2 +- ...ngFieldContentWithTheFluentElementAPI.java | 5 +++ 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/serenity-core/src/main/java/net/serenitybdd/core/pages/PageObject.java b/serenity-core/src/main/java/net/serenitybdd/core/pages/PageObject.java index 690ed1b14e..4d7469f1ad 100644 --- a/serenity-core/src/main/java/net/serenitybdd/core/pages/PageObject.java +++ b/serenity-core/src/main/java/net/serenitybdd/core/pages/PageObject.java @@ -873,9 +873,19 @@ protected JavascriptExecutorFacade getJavascriptExecutorFacade() { public T element(WebElement webElement) { return net.serenitybdd.core.pages.WebElementFacadeImpl.wrapWebElement(driver, webElement, getImplicitWaitTimeout().in(MILLISECONDS), - getWaitForTimeout().in(MILLISECONDS)); + getWaitForTimeout().in(MILLISECONDS), + nameOf(webElement)); } + private String nameOf(WebElement webElement) { + try { + return webElement.toString(); + } catch (Exception e) { + return "Unknown web element"; + } + } + + public T $(WebElement webElement) { return element(webElement); } @@ -892,7 +902,8 @@ public T element(By bySe return net.serenitybdd.core.pages.WebElementFacadeImpl.wrapWebElement(driver, webElement, getImplicitWaitTimeout().in(MILLISECONDS), - getWaitForTimeout().in(MILLISECONDS)); + getWaitForTimeout().in(MILLISECONDS), + bySelector.toString()); } public T find(List selectors) { diff --git a/serenity-core/src/main/java/net/serenitybdd/core/pages/WebElementFacadeImpl.java b/serenity-core/src/main/java/net/serenitybdd/core/pages/WebElementFacadeImpl.java index ee24421fbf..c5ddf335ad 100644 --- a/serenity-core/src/main/java/net/serenitybdd/core/pages/WebElementFacadeImpl.java +++ b/serenity-core/src/main/java/net/serenitybdd/core/pages/WebElementFacadeImpl.java @@ -55,6 +55,7 @@ public class WebElementFacadeImpl implements WebElementFacade, net.thucydides.co private JavascriptExecutorFacade javascriptExecutorFacade; private InternalSystemClock clock = new InternalSystemClock(); private final EnvironmentVariables environmentVariables; + private String foundBy; private ElementLocator locator; private WebElement resolvedELement; @@ -111,14 +112,23 @@ public static T wrapWebElement(final WebDriver driv final WebElement element, final long timeoutInMilliseconds, final long waitForTimeoutInMilliseconds) { - return (T) new WebElementFacadeImpl(driver, null, element, timeoutInMilliseconds, waitForTimeoutInMilliseconds); + return (T) new WebElementFacadeImpl(driver, null, element, timeoutInMilliseconds, waitForTimeoutInMilliseconds) + .foundBy(""); + } + public static T wrapWebElement(final WebDriver driver, + final WebElement element, + final long timeoutInMilliseconds, + final long waitForTimeoutInMilliseconds, + final String foundBy) { + return (T) new WebElementFacadeImpl(driver, null, element, timeoutInMilliseconds, waitForTimeoutInMilliseconds) + .foundBy(foundBy); } public static T wrapWebElement(final WebDriver driver, final WebElement element, final long timeout) { - return (T) new WebElementFacadeImpl(driver, null, element, timeout, timeout); + return (T) new WebElementFacadeImpl(driver, null, element, timeout, timeout).foundBy(element.toString()); } @@ -173,7 +183,8 @@ public T findBy(String xpathOrCssSelector) { .cssSelector(xpathOrCssSelector))); } - return wrapWebElement(driver, nestedElement, timeoutInMilliseconds(), waitForTimeoutInMilliseconds); + return wrapWebElement(driver, nestedElement, timeoutInMilliseconds(), waitForTimeoutInMilliseconds, + "element located by " + xpathOrCssSelector); } @@ -202,7 +213,7 @@ public List thenFindAll(String xpathOrCssSelector) { private List webElementFacadesFrom(List nestedElements) { List results = Lists.newArrayList(); for (WebElement element : nestedElements) { - results.add(wrapWebElement(driver, element, timeoutInMilliseconds(), waitForTimeoutInMilliseconds)); + results.add(wrapWebElement(driver, element, timeoutInMilliseconds(), waitForTimeoutInMilliseconds, element.toString())); } return results; } @@ -211,7 +222,8 @@ private List webElementFacadesFrom(List nestedElem public WebElementFacade findBy(By selector) { logIfVerbose("findBy " + selector); WebElement nestedElement = getElement().findElement(selector); - return wrapWebElement(driver, nestedElement, timeoutInMilliseconds(), waitForTimeoutInMilliseconds); + return wrapWebElement(driver, nestedElement, timeoutInMilliseconds(), waitForTimeoutInMilliseconds, + "element located by " + selector.toString()); } @Override @@ -278,7 +290,10 @@ public Duration getImplicitTimeout() { @Override public WebElementFacade withTimeoutOf(int timeout, TimeUnit unit) { - return wrapWebElement(driver, getElement(), implicitTimeoutInMilliseconds, TimeUnit.MILLISECONDS.convert(timeout, unit)); + return wrapWebElement(driver, getElement(), + implicitTimeoutInMilliseconds, + TimeUnit.MILLISECONDS.convert(timeout, unit), + foundBy); } /** @@ -466,6 +481,10 @@ public void resetTimeouts() { } } + public String getFoundBy() { + return foundBy; + } + class ExtractText implements Converter { public String convert(WebElement from) { @@ -975,7 +994,7 @@ private void logClick() { private void logIfVerbose(String logMessage) { if (useVerboseLogging()) { - LOGGER.debug(logMessage + " : " + locator.toString()); + LOGGER.debug(logMessage + " : " + toString()); } } @@ -1009,8 +1028,7 @@ protected void notifyScreenChange() { @Override public String toString() { - String locatorString = (locator != null) ? locator.toString() : ""; - return (resolvedElement() != null) ? resolvedElement().toString() : locatorString; + return foundBy; } public void submit() { @@ -1105,4 +1123,9 @@ public boolean hasClass(String cssClassName) { List cssClasses = Lists.newArrayList(Splitter.on(" ").omitEmptyStrings().trimResults().split(cssClassValue)); return cssClasses.contains(cssClassName.toLowerCase()); } + + public WebElementFacade foundBy(String foundBy) { + this.foundBy = foundBy; + return this; + } } diff --git a/serenity-core/src/main/java/net/thucydides/core/annotations/locators/WebElementFacadeListItemHandler.java b/serenity-core/src/main/java/net/thucydides/core/annotations/locators/WebElementFacadeListItemHandler.java index 8fdc1ac296..87d5fd1bf4 100644 --- a/serenity-core/src/main/java/net/thucydides/core/annotations/locators/WebElementFacadeListItemHandler.java +++ b/serenity-core/src/main/java/net/thucydides/core/annotations/locators/WebElementFacadeListItemHandler.java @@ -34,7 +34,7 @@ protected Object newElementInstance() throws NoSuchMethodException, Instantiatio WebDriver driver = page.getDriver(); if (implementerClass == WebElementFacadeImpl.class) { // the target constructor is protected; use the static wrapper method - return WebElementFacadeImpl.wrapWebElement(driver, element, implicitTimeoutInMilliseconds, waitForTimeoutInMilliseconds); + return WebElementFacadeImpl.wrapWebElement(driver, element, implicitTimeoutInMilliseconds, waitForTimeoutInMilliseconds, locator.toString()); } /* diff --git a/serenity-core/src/test/java/net/thucydides/core/pages/integration/CheckingFieldContentWithTheFluentElementAPI.java b/serenity-core/src/test/java/net/thucydides/core/pages/integration/CheckingFieldContentWithTheFluentElementAPI.java index 4b2a048505..b31145fc48 100644 --- a/serenity-core/src/test/java/net/thucydides/core/pages/integration/CheckingFieldContentWithTheFluentElementAPI.java +++ b/serenity-core/src/test/java/net/thucydides/core/pages/integration/CheckingFieldContentWithTheFluentElementAPI.java @@ -202,6 +202,11 @@ public void is_currently_enabled_should_be_false_for_an_inexistant_element() thr assertThat(page.element(page.fieldDoesNotExist).isCurrentlyEnabled(), is(false)); } + @Test + public void is_currently_enabled_should_be_false_for_an_inexistant_web_element_facade() throws InterruptedException { + assertThat(page.fieldDoesNotExist.isCurrentlyEnabled(), is(false)); + } + @Test public void should_wait_for_field_to_be_enabled() throws InterruptedException { assertThat(page.element(page.initiallyDisabled).isCurrentlyEnabled(), is(false));