From 918ebc75b64c671efeb54e53d24ebbecda9e2fa7 Mon Sep 17 00:00:00 2001 From: Thanos Angelatos Date: Wed, 24 Apr 2013 21:09:18 +0300 Subject: [PATCH] FIX: Fixed NPE when SizzleCSS would not find a locator, added logback-classic for test scope logging --- pom.xml | 9 +++- .../controllers/webdriverapi/ByExtended.java | 53 ++++++++++++++----- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index 1df3542e..8c92ecd7 100644 --- a/pom.xml +++ b/pom.xml @@ -316,7 +316,14 @@ slf4j-api 1.7.3 - + + ch.qos.logback + logback-classic + 1.0.11 + test + + + diff --git a/src/main/java/com/persado/oss/quality/stevia/selenium/core/controllers/webdriverapi/ByExtended.java b/src/main/java/com/persado/oss/quality/stevia/selenium/core/controllers/webdriverapi/ByExtended.java index e119e6f3..90c9f32c 100644 --- a/src/main/java/com/persado/oss/quality/stevia/selenium/core/controllers/webdriverapi/ByExtended.java +++ b/src/main/java/com/persado/oss/quality/stevia/selenium/core/controllers/webdriverapi/ByExtended.java @@ -32,6 +32,7 @@ */ package com.persado.oss.quality.stevia.selenium.core.controllers.webdriverapi; +import java.lang.reflect.Method; import java.util.List; import java.util.regex.Pattern; import org.openqa.selenium.By; @@ -43,6 +44,7 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.internal.FindsByCssSelector; import org.openqa.selenium.internal.FindsByXPath; +import org.openqa.selenium.remote.RemoteWebElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,11 +100,11 @@ public WebElement findElement(SearchContext context) { .findElementByCssSelector(ownSelector); } } catch (InvalidElementStateException e) { - return findElementBySizzleCss(ownSelector); + return findElementBySizzleCss(context, ownSelector); } catch (WebDriverException e) { if (e.getMessage().startsWith( "An invalid or illegal string was specified")) { - return findElementBySizzleCss(ownSelector); + return findElementBySizzleCss(context, ownSelector); } throw e; } @@ -117,11 +119,11 @@ public List findElements(SearchContext context) { .findElementsByCssSelector(ownSelector); } } catch (InvalidElementStateException e) { - return findElementsBySizzleCss(ownSelector); + return findElementsBySizzleCss(context, ownSelector); } catch (WebDriverException e) { if (e.getMessage().startsWith( "An invalid or illegal string was specified")) { - return findElementsBySizzleCss(ownSelector); + return findElementsBySizzleCss(context, ownSelector); } throw e; } @@ -139,22 +141,40 @@ public String toString() { /** * Find element by sizzle css. + * @param context * * @param cssLocator * the cssLocator * @return the web element */ @SuppressWarnings("unchecked") - public WebElement findElementBySizzleCss(String cssLocator) { - injectSizzleIfNeeded(); - String javascriptExpression = createSizzleSelectorExpression(cssLocator); - List elements = (List) ((JavascriptExecutor) getDriver()) - .executeScript(javascriptExpression); - if (elements.size() > 0) - return (WebElement) elements.get(0); + public WebElement findElementBySizzleCss(SearchContext context, String cssLocator) { + List elements = findElementsBySizzleCss(context, cssLocator); + if (elements != null && elements.size() > 0 ) { + return elements.get(0); + } return null; } + private void fixLocator(SearchContext context, String cssLocator, + WebElement element) { + + if (element instanceof RemoteWebElement) { + try { + Class[] parameterTypes = new Class[] { SearchContext.class, + String.class, String.class }; + Method m = element.getClass().getDeclaredMethod( + "setFoundBy", parameterTypes); + m.setAccessible(true); + Object[] parameters = new Object[] { context, + "css selector", cssLocator }; + m.invoke(element, parameters); + } catch (Exception fail) { + //NOOP Would like to log here? + } + } + } + private WebDriver getDriver() { WebDriverWebController controller = ((WebDriverWebController) SteviaContext.getWebController()); return controller.getDriver(); @@ -168,10 +188,17 @@ private WebDriver getDriver() { * @return the list of the web elements that match this locator */ @SuppressWarnings("unchecked") - public List findElementsBySizzleCss(String cssLocator) { + public List findElementsBySizzleCss(SearchContext context, String cssLocator) { injectSizzleIfNeeded(); String javascriptExpression = createSizzleSelectorExpression(cssLocator); - return (List) ((JavascriptExecutor) getDriver()).executeScript(javascriptExpression); + List elements = (List) ((JavascriptExecutor) getDriver()) + .executeScript(javascriptExpression); + if (elements.size() > 0) { + for (WebElement el : elements) { + fixLocator(context, cssLocator, el); + } + } + return elements; } /**