From d3777295f2efd743939dbe85820a71271c47be57 Mon Sep 17 00:00:00 2001 From: John Ferguson Smart Date: Thu, 18 Jun 2015 22:40:45 +0100 Subject: [PATCH] Performance improvements --- .../locators/SmartAjaxElementLocator.java | 7 +++++-- .../WhenManagingWebdriverTimeouts.groovy | 19 +++++++++++++++++++ .../webdriver/WhenLocatingWebElements.java | 2 -- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/serenity-core/src/main/java/net/thucydides/core/annotations/locators/SmartAjaxElementLocator.java b/serenity-core/src/main/java/net/thucydides/core/annotations/locators/SmartAjaxElementLocator.java index f8a67be195..f6a8b07a9c 100644 --- a/serenity-core/src/main/java/net/thucydides/core/annotations/locators/SmartAjaxElementLocator.java +++ b/serenity-core/src/main/java/net/thucydides/core/annotations/locators/SmartAjaxElementLocator.java @@ -9,6 +9,7 @@ import net.thucydides.core.webdriver.*; import net.thucydides.core.webdriver.exceptions.ElementNotFoundAfterTimeoutError; import net.thucydides.core.webdriver.exceptions.ElementNotVisibleAfterTimeoutError; +import net.thucydides.core.webdriver.stubs.WebElementFacadeStub; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.*; import org.openqa.selenium.support.ui.Clock; @@ -84,7 +85,9 @@ private Optional timeoutFrom(Field field) { @Override public WebElement findElement() { - if (shouldFindElementImmediately()) { + if (aPreviousStepHasFailed()) { + return new WebElementFacadeStub(); + } else if (shouldFindElementImmediately()) { return findElementImmediately(); } else { return ajaxFindElement(); @@ -96,7 +99,7 @@ public void setTimeOutInSeconds(int timeOutInSeconds) { } private boolean shouldFindElementImmediately() { - return aPreviousStepHasFailed() || (MethodTiming.forThisThread().isInQuickMethod()); + return /*aPreviousStepHasFailed() ||*/ (MethodTiming.forThisThread().isInQuickMethod()); } public WebElement findElementImmediately() { diff --git a/serenity-core/src/test/groovy/net/serenitybdd/core/pages/integration/WhenManagingWebdriverTimeouts.groovy b/serenity-core/src/test/groovy/net/serenitybdd/core/pages/integration/WhenManagingWebdriverTimeouts.groovy index 1b45da496a..4c2a6b36b6 100644 --- a/serenity-core/src/test/groovy/net/serenitybdd/core/pages/integration/WhenManagingWebdriverTimeouts.groovy +++ b/serenity-core/src/test/groovy/net/serenitybdd/core/pages/integration/WhenManagingWebdriverTimeouts.groovy @@ -3,6 +3,9 @@ package net.serenitybdd.core.pages.integration import net.serenitybdd.core.pages.WebElementFacade import net.thucydides.core.ThucydidesSystemProperty import net.thucydides.core.pages.integration.StaticSitePage +import net.thucydides.core.steps.ExecutedStepDescription +import net.thucydides.core.steps.StepEventBus +import net.thucydides.core.steps.StepFailure import net.thucydides.core.util.EnvironmentVariables import net.thucydides.core.util.MockEnvironmentVariables import net.thucydides.core.webdriver.StaticTestSite @@ -45,6 +48,7 @@ class WhenManagingWebdriverTimeouts extends Specification { if (phantomJSPath) { environmentVariables.setProperty("phantomjs.binary.path", phantomJSPath) } + StepEventBus.eventBus.clear() } def cleanup() { @@ -74,6 +78,21 @@ class WhenManagingWebdriverTimeouts extends Specification { thrown(org.openqa.selenium.ElementNotVisibleException) } + @Timeout(2) + def "Slow loading fields should not wait once a step has failed"() { + given: "The #slow-loader field takes 4 seconds to load" + and: "A step has failed" + def stepFailure = Mock(StepFailure) + StepEventBus.getEventBus().testStarted("a test") + StepEventBus.getEventBus().stepStarted(ExecutedStepDescription.withTitle("a step")) + StepEventBus.getEventBus().stepFailed(stepFailure); + when: "We access the field" + page = openTestPageUsing(defaultBrowser) + page.verySlowLoadingField.isDisplayed() + then: "Not error should not be thrown" + notThrown(org.openqa.selenium.ElementNotVisibleException) + } + def "The default implicit wait is set to 2 seconds"() { given: "The #city field takes 500 ms to load" page = openTestPageUsing(defaultBrowser) diff --git a/serenity-core/src/test/java/net/thucydides/core/webdriver/WhenLocatingWebElements.java b/serenity-core/src/test/java/net/thucydides/core/webdriver/WhenLocatingWebElements.java index 2adfbca4df..6aa365616f 100644 --- a/serenity-core/src/test/java/net/thucydides/core/webdriver/WhenLocatingWebElements.java +++ b/serenity-core/src/test/java/net/thucydides/core/webdriver/WhenLocatingWebElements.java @@ -70,8 +70,6 @@ public void should_find_element_immediately_if_a_previous_step_has_failed() { public void should_wait_for_find_element_immediately_if_no_previous_step_has_failed() { expectedException.expect(ElementNotVisibleException.class); - expectedException.expectMessage(containsString("Timed out after 2 second")); - SmartAjaxElementLocator locator = new SmartAjaxElementLocator(driver, field, MobilePlatform.NONE); locator.findElement(); }