From ec06e398a83077acb3e4dd762e5d786cd5b4b05c Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 13:33:20 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=20=D0=90dd=20locator=20by=20xpath,=20css?= =?UTF-8?q?=20and=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../htmlelements/annotation/FindBy.java | 12 +++-- .../extension/SelectorProvider.java | 6 ++- .../htmlelements/util/ReflectionUtils.java | 49 ++++++++++++++++--- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/qameta/htmlelements/annotation/FindBy.java b/src/main/java/io/qameta/htmlelements/annotation/FindBy.java index c87366a..a57357e 100644 --- a/src/main/java/io/qameta/htmlelements/annotation/FindBy.java +++ b/src/main/java/io/qameta/htmlelements/annotation/FindBy.java @@ -29,7 +29,9 @@ @HandleWith(FindBy.Extension.class) public @interface FindBy { - String value(); + String xpath() default ""; + String css() default ""; + String id() default ""; class Extension implements MethodHandler { @@ -39,7 +41,7 @@ public Object handle(Context context, Object proxy, Method method, Object[] args // html element proxy (recurse) if (method.isAnnotationPresent(FindBy.class) && WebElement.class.isAssignableFrom(proxyClass)) { - String selector = ReflectionUtils.getSelector(method, args); + By selector = ReflectionUtils.getSelector(method, args); Context childContext = context.newChildContext(method, method.getReturnType()); childContext.getRegistry().getExtensions(ContextEnricher.class) @@ -47,14 +49,14 @@ public Object handle(Context context, Object proxy, Method method, Object[] args return createProxy( method.getReturnType(), childContext, - () -> ((SearchContext) proxy).findElement(By.xpath(selector)), + () -> ((SearchContext) proxy).findElement(selector), WebElement.class, Locatable.class ); } // html element list proxy (recurse) if (method.isAnnotationPresent(FindBy.class) && List.class.isAssignableFrom(method.getReturnType())) { - String selector = ReflectionUtils.getSelector(method, args); + By selector = ReflectionUtils.getSelector(method, args); Context childContext = context.newChildContext(method, method.getReturnType()); childContext.getRegistry().getExtensions(ContextEnricher.class) @@ -63,7 +65,7 @@ public Object handle(Context context, Object proxy, Method method, Object[] args method.getReturnType(), childContext, () -> { - List originalElements = ((SearchContext) proxy).findElements(By.xpath(selector)); + List originalElements = ((SearchContext) proxy).findElements(selector); Type methodReturnType = ((ParameterizedType) method .getGenericReturnType()).getActualTypeArguments()[0]; return (List) originalElements.stream() diff --git a/src/main/java/io/qameta/htmlelements/extension/SelectorProvider.java b/src/main/java/io/qameta/htmlelements/extension/SelectorProvider.java index 414f558..e77ccf9 100644 --- a/src/main/java/io/qameta/htmlelements/extension/SelectorProvider.java +++ b/src/main/java/io/qameta/htmlelements/extension/SelectorProvider.java @@ -2,6 +2,8 @@ import io.qameta.htmlelements.annotation.FindBy; import io.qameta.htmlelements.context.Context; +import io.qameta.htmlelements.util.ReflectionUtils; +import org.openqa.selenium.By; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -22,8 +24,8 @@ class Extension implements ContextEnricher, MethodHandler { @Override public void enrich(Context context, Method method, Object[] args) { - String selector = method.getAnnotation(FindBy.class).value(); - context.getStore().put(SELECTOR_KEY, selector); + By selector = ReflectionUtils.getSelector(method, args); + context.getStore().put(SELECTOR_KEY, selector.toString()); } @Override diff --git a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java index 4277148..2a59b56 100644 --- a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java +++ b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.ConstructorUtils; +import org.openqa.selenium.By; import java.lang.reflect.Method; import java.util.ArrayList; @@ -14,6 +15,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -21,6 +23,9 @@ public class ReflectionUtils { + private static final int UNIQ_LOCATOR_COUNT = 1; + + public static T newInstance(Class clazz) { try { return ConstructorUtils.invokeConstructor(clazz); @@ -70,13 +75,45 @@ public static String getDescription(Class clazz) { return splitCamelCase(clazz.getSimpleName()); } - public static String getSelector(Method method, Object[] args) { - Map parameters = getParameters(method, args); - String selector = method.getAnnotation(FindBy.class).value(); - for (String key : parameters.keySet()) { - selector = selector.replaceAll("\\{\\{ " + key + " \\}\\}", parameters.get(key)); + public static By getSelector(Method method, Object[] args) { + Function replaceParam= locator->{ + Map parameters = getParameters(method, args); + for (String key : parameters.keySet()) { + locator = locator.replaceAll("\\{\\{ " + key + " \\}\\}", parameters.get(key)); + } + return locator; + + }; + + By by= null; + String locator; + FindBy findBy=method.getAnnotation(FindBy.class); + List locators = new ArrayList<>(); + //xpath + if(!findBy.xpath().isEmpty()) { + locator=replaceParam.apply(findBy.xpath()); + by = By.xpath(locator); + locators.add(locator); + } + //css + if(!findBy.css().isEmpty()) { + locator=replaceParam.apply(findBy.css()); + by = By.cssSelector(locator); + locators.add(locator); + } + //id + if(!findBy.id().isEmpty()) { + locator=replaceParam.apply(findBy.id()); + by = By.id(locator); + locators.add(locator); + } + + if (locators.size() != UNIQ_LOCATOR_COUNT) { + throw new IllegalArgumentException( + String.format("You must specify at most one location strategy. Number found: %d (%s)", + locators.size(), locators.toString())); } - return selector; + return by; } public static String getDescription(Method method, Object[] args) { From b77f450c9d86e56b134c459de59b4de1e95d24a7 Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 13:33:57 +0300 Subject: [PATCH 2/7] Remove spaces from param template --- .../java/io/qameta/htmlelements/util/ReflectionUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java index 2a59b56..c31e583 100644 --- a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java +++ b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java @@ -79,7 +79,7 @@ public static By getSelector(Method method, Object[] args) { Function replaceParam= locator->{ Map parameters = getParameters(method, args); for (String key : parameters.keySet()) { - locator = locator.replaceAll("\\{\\{ " + key + " \\}\\}", parameters.get(key)); + locator = locator.replaceAll("\\{\\{" + key + "\\}\\}", parameters.get(key)); } return locator; @@ -121,7 +121,7 @@ public static String getDescription(Method method, Object[] args) { Map parameters = getParameters(method, args); String name = method.getAnnotation(Description.class).value(); for (String key : parameters.keySet()) { - name = name.replaceAll("\\{\\{ " + key + " \\}\\}", parameters.get(key)); + name = name.replaceAll("\\{\\{" + key + "\\}\\}", parameters.get(key)); } return name; } else { From 62334033f74e39bf96ca12b21a2141cd31604c4a Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 13:34:43 +0300 Subject: [PATCH 3/7] Refactoring --- src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java index c31e583..050a3f5 100644 --- a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java +++ b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java @@ -84,7 +84,6 @@ public static By getSelector(Method method, Object[] args) { return locator; }; - By by= null; String locator; FindBy findBy=method.getAnnotation(FindBy.class); From 106b8e3cd916a8d9eaee3654c42228fb21b35e35 Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 13:49:16 +0300 Subject: [PATCH 4/7] Refactor @FindBy annotation in page objects --- .../io/qameta/htmlelements/example/element/SearchArrow.java | 2 +- .../java/io/qameta/htmlelements/example/element/SearchForm.java | 2 +- .../io/qameta/htmlelements/example/element/SuggestItem.java | 2 +- .../io/qameta/htmlelements/example/element/WithSuggest.java | 2 +- .../java/io/qameta/htmlelements/example/page/SearchPage.java | 2 +- .../io/qameta/htmlelements/example/scroll/WikiMainPage.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java index 526eb40..ae244c5 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java @@ -14,7 +14,7 @@ public interface SearchArrow extends WithSuggest, ExtendedWebElement { @Description("Форма {{ className }}") - @FindBy(TestData.SEARCH_FORM_TEMPLATE) + @FindBy(xpath = TestData.SEARCH_FORM_TEMPLATE) SearchForm form(@Param("className") String className); } diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java b/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java index cb7cba9..7ce8782 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java @@ -11,7 +11,7 @@ */ public interface SearchForm extends ExtendedWebElement { - @FindBy(TestData.REQUEST_INPUT_XPATH) + @FindBy(xpath = TestData.REQUEST_INPUT_XPATH) WebElement input(); } diff --git a/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java b/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java index b0b5672..faa02f5 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java @@ -7,7 +7,7 @@ public interface SuggestItem extends ExtendedWebElement{ - @FindBy(TestData.SUGGEST_ITEM_XPATH) + @FindBy(xpath = TestData.SUGGEST_ITEM_XPATH) HtmlElement title(); } diff --git a/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java b/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java index 3b4bb07..c577841 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java +++ b/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java @@ -16,7 +16,7 @@ public interface WithSuggest extends ExtendedWebElement { @Description("Список саджестов") - @FindBy(TestData.SUGGEST_XPATH) + @FindBy(xpath = TestData.SUGGEST_XPATH) ExtendedList suggest(); } diff --git a/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java b/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java index 8fc054a..bc2119b 100644 --- a/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java +++ b/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java @@ -14,7 +14,7 @@ public interface SearchPage extends WebPage { @Description("Поисковая строка") - @FindBy(TestData.SEARCH_ARROW_XPATH) + @FindBy(xpath = TestData.SEARCH_ARROW_XPATH) SearchArrow searchArrow(); } diff --git a/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java b/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java index a1ca994..02fc607 100644 --- a/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java +++ b/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java @@ -11,6 +11,6 @@ @BaseUrl("https://en.wikipedia.org/wiki/Main_Page") public interface WikiMainPage extends WebPage { - @FindBy("//a[.='Complete list of Wikipedias']") + @FindBy(xpath = "//a[.='Complete list of Wikipedias']") ScrollableElement wikiList(); } From 5112c45b401fde2bc6e46d1a017a0cb60c83b72f Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 14:01:37 +0300 Subject: [PATCH 5/7] add default locator (xpath) --- .../java/io/qameta/htmlelements/annotation/FindBy.java | 1 + .../java/io/qameta/htmlelements/util/ReflectionUtils.java | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/io/qameta/htmlelements/annotation/FindBy.java b/src/main/java/io/qameta/htmlelements/annotation/FindBy.java index a57357e..5a61ebd 100644 --- a/src/main/java/io/qameta/htmlelements/annotation/FindBy.java +++ b/src/main/java/io/qameta/htmlelements/annotation/FindBy.java @@ -29,6 +29,7 @@ @HandleWith(FindBy.Extension.class) public @interface FindBy { + String value() default ""; String xpath() default ""; String css() default ""; String id() default ""; diff --git a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java index 050a3f5..abcf61b 100644 --- a/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java +++ b/src/main/java/io/qameta/htmlelements/util/ReflectionUtils.java @@ -88,6 +88,13 @@ public static By getSelector(Method method, Object[] args) { String locator; FindBy findBy=method.getAnnotation(FindBy.class); List locators = new ArrayList<>(); + //default xpath + if(!findBy.value().isEmpty()) { + locator=replaceParam.apply(findBy.value()); + by = By.xpath(locator); + locators.add(locator); + } + //xpath if(!findBy.xpath().isEmpty()) { locator=replaceParam.apply(findBy.xpath()); From 134ce9dcc7e282df546ef421eaa7ddf5be089fe2 Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 14:25:18 +0300 Subject: [PATCH 6/7] delete xpath value --- .../io/qameta/htmlelements/example/element/SearchArrow.java | 2 +- .../java/io/qameta/htmlelements/example/element/SearchForm.java | 2 +- .../io/qameta/htmlelements/example/element/SuggestItem.java | 2 +- .../io/qameta/htmlelements/example/element/WithSuggest.java | 2 +- .../io/qameta/htmlelements/example/scroll/WikiMainPage.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java index ae244c5..526eb40 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchArrow.java @@ -14,7 +14,7 @@ public interface SearchArrow extends WithSuggest, ExtendedWebElement { @Description("Форма {{ className }}") - @FindBy(xpath = TestData.SEARCH_FORM_TEMPLATE) + @FindBy(TestData.SEARCH_FORM_TEMPLATE) SearchForm form(@Param("className") String className); } diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java b/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java index 7ce8782..08236d4 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java @@ -11,7 +11,7 @@ */ public interface SearchForm extends ExtendedWebElement { - @FindBy(xpath = TestData.REQUEST_INPUT_XPATH) + @FindBy(css = TestData.REQUEST_INPUT_XPATH) WebElement input(); } diff --git a/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java b/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java index faa02f5..b0b5672 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SuggestItem.java @@ -7,7 +7,7 @@ public interface SuggestItem extends ExtendedWebElement{ - @FindBy(xpath = TestData.SUGGEST_ITEM_XPATH) + @FindBy(TestData.SUGGEST_ITEM_XPATH) HtmlElement title(); } diff --git a/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java b/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java index c577841..3b4bb07 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java +++ b/src/test/java/io/qameta/htmlelements/example/element/WithSuggest.java @@ -16,7 +16,7 @@ public interface WithSuggest extends ExtendedWebElement { @Description("Список саджестов") - @FindBy(xpath = TestData.SUGGEST_XPATH) + @FindBy(TestData.SUGGEST_XPATH) ExtendedList suggest(); } diff --git a/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java b/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java index 02fc607..9621dcb 100644 --- a/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java +++ b/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java @@ -11,6 +11,6 @@ @BaseUrl("https://en.wikipedia.org/wiki/Main_Page") public interface WikiMainPage extends WebPage { - @FindBy(xpath = "//a[.='Complete list of Wikipedias']") + @FindBy( "//a[.='Complete list of Wikipedias']") ScrollableElement wikiList(); } From 6052220a7dcc7ee9e1b74c75cbf8e6c3f702ba1d Mon Sep 17 00:00:00 2001 From: "maxim.borisenko" Date: Mon, 3 Apr 2017 14:27:02 +0300 Subject: [PATCH 7/7] delete xpath value --- .../java/io/qameta/htmlelements/example/element/SearchForm.java | 2 +- .../java/io/qameta/htmlelements/example/page/SearchPage.java | 2 +- .../io/qameta/htmlelements/example/scroll/WikiMainPage.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java b/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java index 08236d4..cb7cba9 100644 --- a/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java +++ b/src/test/java/io/qameta/htmlelements/example/element/SearchForm.java @@ -11,7 +11,7 @@ */ public interface SearchForm extends ExtendedWebElement { - @FindBy(css = TestData.REQUEST_INPUT_XPATH) + @FindBy(TestData.REQUEST_INPUT_XPATH) WebElement input(); } diff --git a/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java b/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java index bc2119b..8fc054a 100644 --- a/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java +++ b/src/test/java/io/qameta/htmlelements/example/page/SearchPage.java @@ -14,7 +14,7 @@ public interface SearchPage extends WebPage { @Description("Поисковая строка") - @FindBy(xpath = TestData.SEARCH_ARROW_XPATH) + @FindBy(TestData.SEARCH_ARROW_XPATH) SearchArrow searchArrow(); } diff --git a/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java b/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java index 9621dcb..a1ca994 100644 --- a/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java +++ b/src/test/java/io/qameta/htmlelements/example/scroll/WikiMainPage.java @@ -11,6 +11,6 @@ @BaseUrl("https://en.wikipedia.org/wiki/Main_Page") public interface WikiMainPage extends WebPage { - @FindBy( "//a[.='Complete list of Wikipedias']") + @FindBy("//a[.='Complete list of Wikipedias']") ScrollableElement wikiList(); }