From d1a9e51428a004fac2739da3659656b92b0a9a8d Mon Sep 17 00:00:00 2001 From: Hleb Halkouski Date: Fri, 28 Jul 2017 11:59:35 +0300 Subject: [PATCH 1/6] By All was re-implemented, now it returns the first founded element for single search. --- .../pagefactory/DefaultElementByBuilder.java | 2 +- .../bys/builder/AppiumByBuilder.java | 1 - .../pagefactory/bys/builder/ByAll.java | 49 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java diff --git a/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java b/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java index 24a3fd581..84e815997 100644 --- a/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java +++ b/src/main/java/io/appium/java_client/pagefactory/DefaultElementByBuilder.java @@ -23,6 +23,7 @@ import io.appium.java_client.pagefactory.bys.ContentMappedBy; import io.appium.java_client.pagefactory.bys.ContentType; import io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder; +import io.appium.java_client.pagefactory.bys.builder.ByAll; import io.appium.java_client.pagefactory.bys.builder.ByChained; import io.appium.java_client.pagefactory.bys.builder.HowToUseSelectors; import org.openqa.selenium.By; @@ -31,7 +32,6 @@ import org.openqa.selenium.support.FindAll; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.FindBys; -import org.openqa.selenium.support.pagefactory.ByAll; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java index 063a4cbde..0b528d57d 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/AppiumByBuilder.java @@ -24,7 +24,6 @@ import org.openqa.selenium.By; import org.openqa.selenium.support.pagefactory.AbstractAnnotations; -import org.openqa.selenium.support.pagefactory.ByAll; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java new file mode 100644 index 000000000..b5d04b492 --- /dev/null +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -0,0 +1,49 @@ +package io.appium.java_client.pagefactory.bys.builder; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.openqa.selenium.By; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.SearchContext; +import org.openqa.selenium.WebElement; + +import java.util.function.Function; + + +public class ByAll extends org.openqa.selenium.support.pagefactory.ByAll { + + private By[] bys; + + private Function getSearchingFunction(By by) { + return input -> { + try { + return input.findElement(by); + } catch (NoSuchElementException e) { + return null; + } + }; + } + + /** + * @param bys is a set of {@link org.openqa.selenium.By} which forms the all possible searching. + */ + public ByAll(By[] bys) { + super(bys); + checkNotNull(bys); + if (bys.length == 0) { + throw new IllegalArgumentException("By array should not be empty"); + } + this.bys = bys; + } + + @Override + public WebElement findElement(SearchContext context) { + for (By by : bys) { + WebElement element = getSearchingFunction(by).apply(context); + if (element != null) { + return element; + } + } + throw new NoSuchElementException("Cannot locate an element using " + toString()); + } +} \ No newline at end of file From a06a9292a73d10f3f24d709ef3a8e5db4b1ba668 Mon Sep 17 00:00:00 2001 From: Hleb Halkouski Date: Fri, 28 Jul 2017 12:58:53 +0300 Subject: [PATCH 2/6] Fixes after review --- .../pagefactory/bys/builder/ByAll.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java index b5d04b492..28b5bfdd5 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -7,19 +7,22 @@ import org.openqa.selenium.SearchContext; import org.openqa.selenium.WebElement; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; import java.util.function.Function; public class ByAll extends org.openqa.selenium.support.pagefactory.ByAll { - private By[] bys; + private List bys; - private Function getSearchingFunction(By by) { + private Function> getSearchingFunction(By by) { return input -> { try { return input.findElement(by); } catch (NoSuchElementException e) { - return null; + return Optional.empty(); } }; } @@ -30,18 +33,19 @@ private Function getSearchingFunction(By by) { public ByAll(By[] bys) { super(bys); checkNotNull(bys); - if (bys.length == 0) { + + this.bys = Arrays.asList(bys); + if (this.bys.isEmpty()) { throw new IllegalArgumentException("By array should not be empty"); } - this.bys = bys; } @Override public WebElement findElement(SearchContext context) { for (By by : bys) { - WebElement element = getSearchingFunction(by).apply(context); - if (element != null) { - return element; + Optional element = getSearchingFunction(by).apply(context); + if (element.isPresent()) { + return element.get(); } } throw new NoSuchElementException("Cannot locate an element using " + toString()); From 5b7955b7a6cf627b992f5a7ecc31572402aa4dd4 Mon Sep 17 00:00:00 2001 From: Hleb Halkouski Date: Fri, 28 Jul 2017 13:28:04 +0300 Subject: [PATCH 3/6] Fixes after review --- .../pagefactory/bys/builder/ByAll.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java index 28b5bfdd5..e54605d15 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -15,12 +15,12 @@ public class ByAll extends org.openqa.selenium.support.pagefactory.ByAll { - private List bys; + private final List bys; private Function> getSearchingFunction(By by) { return input -> { try { - return input.findElement(by); + return Optional.of(input.findElement(by)); } catch (NoSuchElementException e) { return Optional.empty(); } @@ -42,12 +42,11 @@ public ByAll(By[] bys) { @Override public WebElement findElement(SearchContext context) { - for (By by : bys) { - Optional element = getSearchingFunction(by).apply(context); - if (element.isPresent()) { - return element.get(); - } - } - throw new NoSuchElementException("Cannot locate an element using " + toString()); + return bys.stream() + .map(by -> getSearchingFunction(by).apply(context)) + .filter(Optional::isPresent) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("Cannot locate an element using " + toString())) + .orElse(null); } } \ No newline at end of file From 0cf1f9e4d6bd506fafa866511be0cb41727e94a7 Mon Sep 17 00:00:00 2001 From: Hleb Halkouski Date: Fri, 28 Jul 2017 15:16:04 +0300 Subject: [PATCH 4/6] Fixes after review --- .../io/appium/java_client/pagefactory/bys/builder/ByAll.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java index e54605d15..7f9ae1b7e 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -45,8 +45,7 @@ public WebElement findElement(SearchContext context) { return bys.stream() .map(by -> getSearchingFunction(by).apply(context)) .filter(Optional::isPresent) - .findFirst() - .orElseThrow(() -> new NoSuchElementException("Cannot locate an element using " + toString())) - .orElse(null); + .findFirst().map(Optional::get) + .orElseThrow(() -> new NoSuchElementException("Cannot locate an element using " + toString())); } } \ No newline at end of file From cef9efed9f1d592da363fbc09948d7a4cd013f19 Mon Sep 17 00:00:00 2001 From: Hleb Halkouski Date: Fri, 28 Jul 2017 17:53:15 +0300 Subject: [PATCH 5/6] Fixes after review --- .../io/appium/java_client/pagefactory/bys/builder/ByAll.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java index 7f9ae1b7e..192764252 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -45,7 +45,8 @@ public WebElement findElement(SearchContext context) { return bys.stream() .map(by -> getSearchingFunction(by).apply(context)) .filter(Optional::isPresent) - .findFirst().map(Optional::get) + .map(Optional::get) + .findFirst() .orElseThrow(() -> new NoSuchElementException("Cannot locate an element using " + toString())); } } \ No newline at end of file From 3917b523d2edc9658c9ea9fc6d03d8fedf1b6bb8 Mon Sep 17 00:00:00 2001 From: Hleb Halkouski Date: Mon, 31 Jul 2017 13:12:23 +0300 Subject: [PATCH 6/6] Finish fixes after review --- .../appium/java_client/pagefactory/bys/builder/ByAll.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java index 192764252..a73099eb3 100644 --- a/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -1,5 +1,6 @@ package io.appium.java_client.pagefactory.bys.builder; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import org.openqa.selenium.By; @@ -35,9 +36,8 @@ public ByAll(By[] bys) { checkNotNull(bys); this.bys = Arrays.asList(bys); - if (this.bys.isEmpty()) { - throw new IllegalArgumentException("By array should not be empty"); - } + + checkArgument(this.bys.isEmpty(), "By array should not be empty"); } @Override