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..a73099eb3 --- /dev/null +++ b/src/main/java/io/appium/java_client/pagefactory/bys/builder/ByAll.java @@ -0,0 +1,52 @@ +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; +import org.openqa.selenium.NoSuchElementException; +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 final List bys; + + private Function> getSearchingFunction(By by) { + return input -> { + try { + return Optional.of(input.findElement(by)); + } catch (NoSuchElementException e) { + return Optional.empty(); + } + }; + } + + /** + * @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); + + this.bys = Arrays.asList(bys); + + checkArgument(this.bys.isEmpty(), "By array should not be empty"); + } + + @Override + public WebElement findElement(SearchContext context) { + return bys.stream() + .map(by -> getSearchingFunction(by).apply(context)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("Cannot locate an element using " + toString())); + } +} \ No newline at end of file