Skip to content

Commit

Permalink
Refactor Filters and add textContent() filter.
Browse files Browse the repository at this point in the history
  • Loading branch information
Toilal committed Oct 6, 2016
1 parent 8a83522 commit 2d84d7f
Show file tree
Hide file tree
Showing 31 changed files with 413 additions and 365 deletions.
Expand Up @@ -16,11 +16,11 @@
import org.fluentlenium.core.domain.FluentWebElement; import org.fluentlenium.core.domain.FluentWebElement;
import org.fluentlenium.core.events.AnnotationsComponentListener; import org.fluentlenium.core.events.AnnotationsComponentListener;
import org.fluentlenium.core.events.EventsRegistry; import org.fluentlenium.core.events.EventsRegistry;
import org.fluentlenium.core.filter.Filter;
import org.fluentlenium.core.inject.DefaultContainerInstanciator; import org.fluentlenium.core.inject.DefaultContainerInstanciator;
import org.fluentlenium.core.inject.FluentInjector; import org.fluentlenium.core.inject.FluentInjector;
import org.fluentlenium.core.script.FluentJavascript; import org.fluentlenium.core.script.FluentJavascript;
import org.fluentlenium.core.search.Search; import org.fluentlenium.core.search.Search;
import org.fluentlenium.core.search.SearchFilter;
import org.fluentlenium.core.wait.FluentWait; import org.fluentlenium.core.wait.FluentWait;
import org.openqa.selenium.By; import org.openqa.selenium.By;
import org.openqa.selenium.Cookie; import org.openqa.selenium.Cookie;
Expand Down Expand Up @@ -323,47 +323,47 @@ public FluentJavascript executeAsyncScript(final String script, final Object...
} }


@Override @Override
public FluentList<FluentWebElement> $(final String selector, final Filter... filters) { public FluentList<FluentWebElement> $(final String selector, final SearchFilter... filters) {
return find(selector, filters); return find(selector, filters);
} }


@Override @Override
public FluentWebElement el(final String selector, final Filter... filters) { public FluentWebElement el(final String selector, final SearchFilter... filters) {
return find(selector, filters).first(); return find(selector, filters).first();
} }


@Override @Override
public FluentList<FluentWebElement> $(final Filter... filters) { public FluentList<FluentWebElement> $(final SearchFilter... filters) {
return find(filters); return find(filters);
} }


@Override @Override
public FluentWebElement el(final Filter... filters) { public FluentWebElement el(final SearchFilter... filters) {
return find(filters).first(); return find(filters).first();
} }


@Override @Override
public FluentList<FluentWebElement> $(final By locator, final Filter... filters) { public FluentList<FluentWebElement> $(final By locator, final SearchFilter... filters) {
return find(locator, filters); return find(locator, filters);
} }


@Override @Override
public FluentWebElement el(final By locator, final Filter... filters) { public FluentWebElement el(final By locator, final SearchFilter... filters) {
return find(locator, filters).first(); return find(locator, filters).first();
} }


@Override @Override
public FluentList<FluentWebElement> find(final String selector, final Filter... filters) { public FluentList<FluentWebElement> find(final String selector, final SearchFilter... filters) {
return getSearch().find(selector, filters); return getSearch().find(selector, filters);
} }


@Override @Override
public FluentList<FluentWebElement> find(final By locator, final Filter... filters) { public FluentList<FluentWebElement> find(final By locator, final SearchFilter... filters) {
return getSearch().find(locator, filters); return getSearch().find(locator, filters);
} }


@Override @Override
public FluentList<FluentWebElement> find(final Filter... filters) { public FluentList<FluentWebElement> find(final SearchFilter... filters) {
return getSearch().find(filters); return getSearch().find(filters);
} }


Expand Down
Expand Up @@ -2,11 +2,11 @@


import org.fluentlenium.core.action.FluentActions; import org.fluentlenium.core.action.FluentActions;
import org.fluentlenium.core.conditions.FluentListConditions; import org.fluentlenium.core.conditions.FluentListConditions;
import org.fluentlenium.core.filter.Filter;
import org.fluentlenium.core.hook.HookControl; import org.fluentlenium.core.hook.HookControl;
import org.fluentlenium.core.label.FluentLabel; import org.fluentlenium.core.label.FluentLabel;
import org.fluentlenium.core.proxy.FluentProxyState; import org.fluentlenium.core.proxy.FluentProxyState;
import org.fluentlenium.core.search.SearchControl; import org.fluentlenium.core.search.SearchControl;
import org.fluentlenium.core.search.SearchFilter;
import org.fluentlenium.core.wait.FluentWaitElementList; import org.fluentlenium.core.wait.FluentWaitElementList;
import org.openqa.selenium.WebElement; import org.openqa.selenium.WebElement;


Expand Down Expand Up @@ -178,7 +178,7 @@ public interface FluentList<E extends FluentWebElement>
* @return extended by FluentWebElement objects list * @return extended by FluentWebElement objects list
*/ */
@Override @Override
FluentList<E> find(String selector, Filter... filters); FluentList<E> find(String selector, SearchFilter... filters);


/** /**
* find elements in the children with the corresponding filters * find elements in the children with the corresponding filters
Expand All @@ -187,7 +187,7 @@ public interface FluentList<E extends FluentWebElement>
* @return extended by FluentWebElement objects list * @return extended by FluentWebElement objects list
*/ */
@Override @Override
FluentList<E> find(Filter... filters); FluentList<E> find(SearchFilter... filters);


/** /**
* Clear all elements on the list * Clear all elements on the list
Expand Down
Expand Up @@ -14,7 +14,6 @@
import org.fluentlenium.core.conditions.EachElementConditions; import org.fluentlenium.core.conditions.EachElementConditions;
import org.fluentlenium.core.conditions.FluentListConditions; import org.fluentlenium.core.conditions.FluentListConditions;
import org.fluentlenium.core.conditions.wait.WaitConditionProxy; import org.fluentlenium.core.conditions.wait.WaitConditionProxy;
import org.fluentlenium.core.filter.Filter;
import org.fluentlenium.core.hook.DefaultHookChainBuilder; import org.fluentlenium.core.hook.DefaultHookChainBuilder;
import org.fluentlenium.core.hook.FluentHook; import org.fluentlenium.core.hook.FluentHook;
import org.fluentlenium.core.hook.HookChainBuilder; import org.fluentlenium.core.hook.HookChainBuilder;
Expand All @@ -24,6 +23,7 @@
import org.fluentlenium.core.label.FluentLabelImpl; import org.fluentlenium.core.label.FluentLabelImpl;
import org.fluentlenium.core.proxy.LocatorHandler; import org.fluentlenium.core.proxy.LocatorHandler;
import org.fluentlenium.core.proxy.LocatorProxies; import org.fluentlenium.core.proxy.LocatorProxies;
import org.fluentlenium.core.search.SearchFilter;
import org.fluentlenium.core.wait.FluentWaitElementList; import org.fluentlenium.core.wait.FluentWaitElementList;
import org.openqa.selenium.By; import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.NoSuchElementException;
Expand Down Expand Up @@ -398,37 +398,37 @@ public String textContent() {
} }


@Override @Override
public FluentList<E> $(final String selector, final Filter... filters) { public FluentList<E> $(final String selector, final SearchFilter... filters) {
return find(selector, filters); return find(selector, filters);
} }


@Override @Override
public E el(final String selector, final Filter... filters) { public E el(final String selector, final SearchFilter... filters) {
return find(selector, filters).first(); return find(selector, filters).first();
} }


@Override @Override
public FluentList<E> $(final Filter... filters) { public FluentList<E> $(final SearchFilter... filters) {
return find(filters); return find(filters);
} }


@Override @Override
public E el(final Filter... filters) { public E el(final SearchFilter... filters) {
return find(filters).first(); return find(filters).first();
} }


@Override @Override
public FluentList<E> $(final By locator, final Filter... filters) { public FluentList<E> $(final By locator, final SearchFilter... filters) {
return find(locator, filters); return find(locator, filters);
} }


@Override @Override
public E el(final By locator, final Filter... filters) { public E el(final By locator, final SearchFilter... filters) {
return find(locator, filters).first(); return find(locator, filters).first();
} }


@Override @Override
public FluentList<E> find(final String selector, final Filter... filters) { public FluentList<E> find(final String selector, final SearchFilter... filters) {
final List<E> finds = new ArrayList<>(); final List<E> finds = new ArrayList<>();
for (final FluentWebElement e : this) { for (final FluentWebElement e : this) {
finds.addAll((Collection<E>) e.find(selector, filters)); finds.addAll((Collection<E>) e.find(selector, filters));
Expand All @@ -437,7 +437,7 @@ public FluentList<E> find(final String selector, final Filter... filters) {
} }


@Override @Override
public FluentList<E> find(final By locator, final Filter... filters) { public FluentList<E> find(final By locator, final SearchFilter... filters) {
final List<E> finds = new ArrayList<>(); final List<E> finds = new ArrayList<>();
for (final FluentWebElement e : this) { for (final FluentWebElement e : this) {
finds.addAll((Collection<E>) e.find(locator, filters)); finds.addAll((Collection<E>) e.find(locator, filters));
Expand All @@ -446,7 +446,7 @@ public FluentList<E> find(final By locator, final Filter... filters) {
} }


@Override @Override
public FluentList<E> find(final Filter... filters) { public FluentList<E> find(final SearchFilter... filters) {
final List<E> finds = new ArrayList<>(); final List<E> finds = new ArrayList<>();
for (final FluentWebElement e : this) { for (final FluentWebElement e : this) {
finds.addAll((Collection<E>) e.find(filters)); finds.addAll((Collection<E>) e.find(filters));
Expand Down
Expand Up @@ -15,7 +15,6 @@
import org.fluentlenium.core.components.ComponentInstantiator; import org.fluentlenium.core.components.ComponentInstantiator;
import org.fluentlenium.core.conditions.FluentConditions; import org.fluentlenium.core.conditions.FluentConditions;
import org.fluentlenium.core.conditions.WebElementConditions; import org.fluentlenium.core.conditions.WebElementConditions;
import org.fluentlenium.core.filter.Filter;
import org.fluentlenium.core.hook.DefaultHookChainBuilder; import org.fluentlenium.core.hook.DefaultHookChainBuilder;
import org.fluentlenium.core.hook.FluentHook; import org.fluentlenium.core.hook.FluentHook;
import org.fluentlenium.core.hook.HookChainBuilder; import org.fluentlenium.core.hook.HookChainBuilder;
Expand All @@ -29,6 +28,7 @@
import org.fluentlenium.core.proxy.LocatorProxies; import org.fluentlenium.core.proxy.LocatorProxies;
import org.fluentlenium.core.search.Search; import org.fluentlenium.core.search.Search;
import org.fluentlenium.core.search.SearchControl; import org.fluentlenium.core.search.SearchControl;
import org.fluentlenium.core.search.SearchFilter;
import org.fluentlenium.core.wait.AwaitControl; import org.fluentlenium.core.wait.AwaitControl;
import org.fluentlenium.core.wait.FluentWaitElement; import org.fluentlenium.core.wait.FluentWaitElement;
import org.openqa.selenium.By; import org.openqa.selenium.By;
Expand Down Expand Up @@ -346,47 +346,47 @@ public FluentList<FluentWebElement> asList() {
} }


@Override @Override
public FluentList<FluentWebElement> $(final String selector, final Filter... filters) { public FluentList<FluentWebElement> $(final String selector, final SearchFilter... filters) {
return find(selector, filters); return find(selector, filters);
} }


@Override @Override
public FluentWebElement el(final String selector, final Filter... filters) { public FluentWebElement el(final String selector, final SearchFilter... filters) {
return find(selector, filters).first(); return find(selector, filters).first();
} }


@Override @Override
public FluentList<FluentWebElement> $(final Filter... filters) { public FluentList<FluentWebElement> $(final SearchFilter... filters) {
return find(filters); return find(filters);
} }


@Override @Override
public FluentWebElement el(final Filter... filters) { public FluentWebElement el(final SearchFilter... filters) {
return find(filters).first(); return find(filters).first();
} }


@Override @Override
public FluentList<FluentWebElement> $(final By locator, final Filter... filters) { public FluentList<FluentWebElement> $(final By locator, final SearchFilter... filters) {
return find(locator, filters); return find(locator, filters);
} }


@Override @Override
public FluentWebElement el(final By locator, final Filter... filters) { public FluentWebElement el(final By locator, final SearchFilter... filters) {
return find(locator, filters).first(); return find(locator, filters).first();
} }


@Override @Override
public FluentList<FluentWebElement> find(final By locator, final Filter... filters) { public FluentList<FluentWebElement> find(final By locator, final SearchFilter... filters) {
return search.find(locator, filters); return search.find(locator, filters);
} }


@Override @Override
public FluentList<FluentWebElement> find(final String selector, final Filter... filters) { public FluentList<FluentWebElement> find(final String selector, final SearchFilter... filters) {
return search.find(selector, filters); return search.find(selector, filters);
} }


@Override @Override
public FluentList<FluentWebElement> find(final Filter... filters) { public FluentList<FluentWebElement> find(final SearchFilter... filters) {
return search.find(filters); return search.find(filters);
} }


Expand Down
@@ -0,0 +1,72 @@
package org.fluentlenium.core.filter;

import com.google.common.collect.Collections2;
import org.fluentlenium.core.domain.FluentWebElement;
import org.fluentlenium.core.filter.matcher.AbstractMatcher;
import org.fluentlenium.core.filter.matcher.EqualMatcher;
import org.fluentlenium.core.search.SearchFilter;

import java.util.Collection;
import java.util.Locale;

/**
* Search filter based on attribute value.
*/
public class AttributeFilter implements SearchFilter {
private final String attributeName;
private final AbstractMatcher matcher;

/**
* Construct a filter with an attribute name and an associated value
*
* @param attributeName attribute name
* @param value value to filter
*/
public AttributeFilter(String attributeName, final String value) {
this.attributeName = attributeName;
this.matcher = new EqualMatcher(value);
}

/**
* Construct a filter with a custom attribute and an associated matcher
*
* @param customAttribute custom attribute name
* @param matcher matcher
*/
public AttributeFilter(final String customAttribute, final AbstractMatcher matcher) {
this.attributeName = customAttribute;
this.matcher = matcher;
}

public String getAttribut() {
return attributeName.toLowerCase(Locale.ENGLISH);
}

public String toString() {
return getCssFilter();
}

public AbstractMatcher getMatcher() {
return matcher;
}

@Override
public String getCssFilter() {
String matcherAttribute = matcher == null ? null : matcher.getMatcherSymbol();
if (matcherAttribute == null) {
matcherAttribute = "";
}
return "[" + attributeName.toLowerCase(Locale.ENGLISH) + matcherAttribute + "=\"" + matcher.getValue() + "\"]";
}

@Override
public boolean isCssFilterSupported() {
return matcher != null && matcher.isCssFilterSupported() && !"text".equalsIgnoreCase(getAttribut()) && !"textContent"
.equalsIgnoreCase(getAttribut());
}

@Override
public Collection<FluentWebElement> applyFilter(final Collection<FluentWebElement> elements) {
return Collections2.filter(elements, new AttributeFilterPredicate(this));
}
}
@@ -0,0 +1,28 @@
package org.fluentlenium.core.filter;

import com.google.common.base.Predicate;
import org.fluentlenium.core.domain.FluentWebElement;

/**
* Filter a FluentWebElement collection to return only the elements with the same text
*/
public class AttributeFilterPredicate implements Predicate<FluentWebElement> {
private final AttributeFilter filter;

public AttributeFilterPredicate(final AttributeFilter text) {
this.filter = text;
}

public boolean apply(final FluentWebElement element) {

final String attribute = getAttributeValue(element);
return filter != null && filter.getMatcher().isSatisfiedBy(attribute);
}

private String getAttributeValue(final FluentWebElement element) {
return "text".equalsIgnoreCase(filter.getAttribut())
? element.text()
: element.attribute(filter.getAttribut());
}

}

0 comments on commit 2d84d7f

Please sign in to comment.