package net.thucydides.core.annotations.findby; import com.google.common.base.Preconditions; import org.openqa.selenium.*; import java.util.List; public abstract class By extends org.openqa.selenium.By { /** * @param scLocator The scLocator to use * @return a By which locates elements via AutoTest */ public static By sclocator(final String scLocator) { Preconditions.checkNotNull(scLocator); return new ByScLocator(scLocator); } public static class ByScLocator extends By { private final String scLocator; public ByScLocator(String scLocator) { this.scLocator = scLocator; } @Override public List<WebElement> findElements(SearchContext context) { throw new IllegalArgumentException("SmartGWT does not provide the functionality to find multiple elements"); } @Override public WebElement findElement(SearchContext context) { try { WebElement element = (WebElement) ((JavascriptExecutor) context) .executeScript("return isc.AutoTest.getElement(arguments[0]);", scLocator); if (element != null){ return element; } } catch (WebDriverException e){ if ((Boolean) ((JavascriptExecutor) context) .executeScript("return (typeof isc == 'undefined')")){ throw new NoSuchElementException("Not a SmartGWT page. Cannot locate element using SmartGTW locator " + toString()); } } throw new NoSuchElementException("Cannot locate element using " + toString()); } @Override public String toString() { return "By.sclocator: " + scLocator; } } /** * @param jQuerySelector The jquery to use * @return a By selector object which locates elements via jQuery */ public static By jquery(final String jQuerySelector) { Preconditions.checkNotNull(jQuerySelector); return new ByjQuerySelector(jQuerySelector); } public static class ByjQuerySelector extends By { private final String jQuerySelector; public ByjQuerySelector(String jQuerySelector) { this.jQuerySelector = jQuerySelector; } @SuppressWarnings("unchecked") @Override public List<WebElement> findElements(SearchContext context) { List<WebElement> elements = (List<WebElement>) ((JavascriptExecutor) context) .executeScript("var elements = $(arguments[0]).get(); return ((elements.length) ? elements : null)", jQuerySelector); if (elements != null){ return elements; } throw new NoSuchElementException("Cannot locate elements using " + toString()); } @Override public WebElement findElement(SearchContext context) { WebElement element = (WebElement) ((JavascriptExecutor) context) .executeScript("return $(arguments[0]).get(0)", jQuerySelector); if (element != null){ return element; } throw new NoSuchElementException("Cannot locate element using " + toString()); } @Override public String toString() { return "By.jQuerySelector: " + jQuerySelector; } } }