How to use AbstractFluentDriverComponentInstantiator class of org.fluentlenium.core package

Best FluentLenium code snippet using org.fluentlenium.core.AbstractFluentDriverComponentInstantiator

Source:AbstractFluentDriverComponentInstantiator.java Github

copy

Full Screen

...7import java.util.List;8/**9 * Abstract {@link org.fluentlenium.core.components.ComponentInstantiator} implementation for {@link FluentDriver}.10 */11abstract class AbstractFluentDriverComponentInstantiator extends FluentControlImpl {12 protected AbstractFluentDriverComponentInstantiator(FluentControl adapter) {13 super(adapter);14 }15 /**16 * Returns the {@link ComponentsManager} required for this class.17 *18 * @return the components manager19 */20 protected abstract ComponentsManager getComponentsManager();21 @Override22 public <L extends List<T>, T> L newComponentList(Class<L> listClass, Class<T> componentClass) {23 return getComponentsManager().newComponentList(listClass, componentClass);24 }25 @Override26 public <T> ComponentList asComponentList(Class<T> componentClass, Iterable<WebElement> elements) {...

Full Screen

Full Screen

Source:AbstractFluentDriverSearchControl.java Github

copy

Full Screen

...8import java.util.List;9/**10 * Abstract {@link org.fluentlenium.core.search.SearchControl} implemetation for {@link FluentDriver}.11 */12abstract class AbstractFluentDriverSearchControl extends AbstractFluentDriverComponentInstantiator {13 protected AbstractFluentDriverSearchControl(FluentControl adapter) {14 super(adapter);15 }16 /**17 * Return the {@link Search} required for this class.18 *19 * @return the Search object20 */21 protected abstract Search getSearch();22 @Override23 public FluentList<FluentWebElement> find(String selector, SearchFilter... filters) {24 return getSearch().find(selector, filters);25 }26 @Override...

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.domain.FluentWebElement;2import org.fluentlenium.core.FluentPage;3import org.fluentlenium.core.FluentDriver;4import org.fluentlenium.core.FluentControl;5import org.fluentlenium.core.FluentControlImpl;6import org.fluentlenium.core.FluentAdapter;7import org.fluentlenium.core.Fluent;8import org.fluentlenium.core.FluentPage;9import org.fluentlenium.core.FluentDriver;10import org.fluentlenium.core.FluentControl;11import org.fluentlenium.core.FluentControlImpl;12import org.fluentlenium.core.FluentAdapter;13import org.fluentlenium.core.Fluent;14import org.fluentlenium.core.FluentPage;15import org.fluentlenium.core.FluentDriver;16import org.fluentlenium.core.FluentControl;17import org.fluentlenium.core.FluentControlImpl;18import org.fluentlenium.core.FluentAdapter;19import org.fluentlenium.core.Fluent;20import org.fluentlenium.core.FluentPage;21import org.fluentlenium.core.FluentDriver;22import org.fluentlenium.core.FluentControl;23import org.fluentlenium.core.FluentControlImpl;24import org.fluentlenium.core.FluentAdapter;25import org.fluentlenium.core.Fluent;26import org.fluentlenium.core.FluentPage;27import org.fluentlenium.core.FluentDriver;28import org.fluentlenium.core.FluentControl;29import org.fluentlenium.core.FluentControlImpl;30import org.fluentlenium.core.FluentAdapter;31import org.fluentlenium.core.Fluent;32import org.fluentlenium.core.FluentPage;33import org.fluentlenium.core.FluentDriver;34import org.fluentlenium.core.FluentControl;35import org.fluentlenium.core.FluentControlImpl;36import org.fluentlenium.core.FluentAdapter;37import org.fluentlenium.core.Fluent;38import org.fluentlenium.core.FluentPage;39import org.fluentlenium.core.FluentDriver;40import org.fluentlenium.core.FluentControl;41import org.fluentlenium.core.FluentControlImpl;42import org.fluentlenium.core.FluentAdapter;43import org.fluentlenium.core.Fluent;44import org.fluentlenium.core.FluentPage;45import org.fluentlenium.core.FluentDriver;46import org

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.FluentDriverComponentInstantiator;2import org.fluentlenium.core.FluentPage;3import org.fluentlenium.core.FluentTest;4import org.fluentlenium.core.domain.FluentWebElement;5import org.junit.Test;6import org.openqa.selenium.WebDriver;7import org.openqa.selenium.htmlunit.HtmlUnitDriver;8public class TestAbstractFluentDriverComponentInstantiator extends FluentTest {9 public WebDriver getDefaultDriver() {10 return new HtmlUnitDriver();11 }12 public void testPage() {13 fill("#lst-ib").with("FluentLenium");14 submit("#lst-ib");15 FluentWebElement element = findFirst("#resultStats");16 System.out.println(element.text());17 }18 public FluentDriverComponentInstantiator newFluentDriverComponentInstantiator() {19 return new FluentDriverComponentInstantiator() {20 public <P extends FluentPage> P newInstance(Class<P> pageClass) {21 return super.newInstance(pageClass);22 }23 };24 }25}26import org.fluentlenium.core.FluentPage;27import org.fluentlenium.core.annotation.Page;28import org.fluentlenium.core.annotation.PageUrl;29import org.fluentlenium.core.domain.FluentWebElement;30import org.junit.Test;31import org.openqa.selenium.WebDriver;32import org.openqa.selenium.htmlunit.HtmlUnitDriver;33public class TestAbstractFluentPage extends FluentPage {34 private Page2 page2;35 private String url;36 public void testPage() {37 fill("#lst-ib").with("FluentLenium");38 submit("#lst-ib");39 FluentWebElement element = findFirst("#resultStats");40 System.out.println(element.text());41 }42}43import org.fluentlenium.core.FluentPage;44import org.fluentlenium.core.FluentTest;45import org.fluentlenium.core.annotation.Page;46import org.fluentlenium.core.annotation.PageUrl;47import org.fluentlenium.core.domain.FluentWebElement

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.FluentPage;2import org.fluentlenium.core.FluentDriver;3import org.fluentlenium.core.FluentControl;4import org.fluentlenium.core.FluentList;5import org.fluentlenium.core.Fluent;6import org.fluentlenium.core.domain.FluentWebElement;7import org.fluentlenium.core.filter.FilterConstructor;8import org.fluentlenium.core.filter.Filter;9import org.fluentlenium.core.filter.matcher.Matcher;10import org.fluentlenium.core.filter.matcher.Matchers;11import org.fluentlenium.core.filter.matcher.MatcherFilter;12import org.fluentlenium.core.filter.matcher.MatcherFilters;13import org.fluentlenium.core.filter.matcher.ContainsMatcher;14import org.fluentlenium.core.filter.matcher.ContainsMatchers;15import org.fluentlenium.core.filter.matcher.EqualMatcher;16import org.fluentlenium.core.filter.matcher.EqualMatchers;17import org.fluentlenium.core.filter.matcher.FilterMatcher;18import org.fluentlenium.core.filter.matcher.FilterMatchers;19import org.fluentlenium.core.filter.matcher.StartsWithMatcher;20import org.fluentlenium.core.filter.matcher.StartsWithMatchers;21import org.fluentlenium.core.filter.matcher.EndsWithMatcher;22import org.fluentlenium.core.filter.matcher.EndsWithMatchers;23import org.fluentlenium.core.filter.matcher.RegexMatcher;24import org.fluentlenium.core.filter.matcher.RegexMatchers;25import org.fluentlenium.core.filter.matcher.CustomMatcher;26import org.fluentlenium.core.filter.matcher.CustomMatchers;27import org.fluentlenium.core.filter.matcher.CustomMatcherFilter;28import org.fluentlenium.core.filter.matcher.CustomMatcherFilters;29import org.fluentlenium.core.filter.matcher.MatcherFilterConstructor;30import org.fluentlenium.core.filter.matcher.MatcherFilterConstructors;31import org.fluentlenium.core.filter.matcher.MatcherConstructor;32import org.fluentlenium.core.filter.matcher.MatcherConstructors;33import org.fluentlenium.core.filter.matcher.MatcherFilterMatcher;34import org.fluentlenium.core.filter.matcher.MatcherFilterMatchers;35import org.fluentlenium.core.filter.matcher.MatcherFilterMatcherFilter;36import org.fluentlenium.core.filter.matcher.MatcherFilterMatcherFilters;37import org.fluentlenium.core.filter.matcher.MatcherFilterMatcherConstructor;38import org.fluentlenium.core.filter.matcher.MatcherFilterMatcherConstructors;39import org.fluentlenium.core.filter.matcher.MatcherFilterMatcherFilterConstructor;40import org.fluentlenium.core.filter.matcher.MatcherFilterMatcherFilterConstructors;41import org.fl

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.FluentDriver;2import org.fluentlenium.core.domain.FluentWebElement;3import org.fluentlenium.core.inject.FluentInjector;4import org.fluentlenium.core.inject.FluentInjectorModule;5import org.fluentlenium.core.inject.PageObjectInjector;6import org.fluentlenium.core.inject.PageObjectInjectorModule;7import org.fluentlenium.core.inject.PageObjectProvider;8import org.fluentlenium.core.search.Search;9import org.openqa.selenium.WebDriver;10import org.openqa.selenium.WebElement;11import com.google.inject.Injector;12public class AbstractFluentDriverComponentInstantiator extends AbstractComponentInstantiator {13 private final FluentDriver fluentDriver;14 private final Injector injector;15 public AbstractFluentDriverComponentInstantiator(FluentDriver fluentDriver, Injector injector) {16 this.fluentDriver = fluentDriver;17 this.injector = injector;18 }19 public FluentWebElement newFluent(WebElement element, Search search) {20 return new FluentWebElement(element, fluentDriver, search);21 }22 public <P> P newInstance(Class<P> pageObjectClass) {23 return injector.getInstance(pageObjectClass);24 }25 public <P> P newInstance(Class<P> pageObjectClass, Object... args) {26 return injector.getInstance(pageObjectClass);27 }28 public <P> P newInstance(Class<P> pageObjectClass, Class<?>[] parameterTypes, Object... args) {29 return injector.getInstance(pageObjectClass);30 }31 public static class Builder {32 private FluentDriver fluentDriver;33 private Injector injector;34 public Builder fluentDriver(FluentDriver fluentDriver) {35 this.fluentDriver = fluentDriver;36 return this;37 }38 public Builder injector(Injector injector) {39 this.injector = injector;40 return this;41 }42 public AbstractFluentDriverComponentInstantiator build() {43 if (fluentDriver == null) {44 throw new IllegalArgumentException("FluentDriver must be set");45 }46 if (injector == null) {47 injector = createInjector(fluentDriver.getDriver());48 }49 return new AbstractFluentDriverComponentInstantiator(fluentDriver, injector);50 }51 private Injector createInjector(WebDriver driver) {52 return FluentInjector.builder()53 .withModule(new FluentInjectorModule(driver))54 .withModule(new PageObjectInjectorModule(driver))55 .build();

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1package org.fluentlenium.core;2import org.fluentlenium.core.components.ComponentInstantiator;3import org.openqa.selenium.WebDriver;4public class AbstractFluentDriverComponentInstantiator extends AbstractComponentInstantiator {5 private final WebDriver driver;6 public AbstractFluentDriverComponentInstantiator(WebDriver driver) {7 this.driver = driver;8 }9 public WebDriver getDriver() {10 return driver;11 }12}13package org.fluentlenium.core;14import org.fluentlenium.core.components.ComponentInstantiator;15import org.openqa.selenium.WebDriver;16public class FluentDriverComponentInstantiator extends AbstractFluentDriverComponentInstantiator {17 public FluentDriverComponentInstantiator(WebDriver driver) {18 super(driver);19 }20 public WebDriver getDriver() {21 return super.getDriver();22 }23}24package org.fluentlenium.core;25import org.fluentlenium.core.components.ComponentInstantiator;26import org.openqa.selenium.By;27import org.openqa.selenium.SearchContext;28import org.openqa.selenium.WebDriver;29import org.openqa.selenium.WebElement;30import java.util.List;31public class FluentWebElement extends AbstractFluentWebElement {32 public FluentWebElement(WebElement element, ComponentInstantiator instantiator) {33 super(element, instantiator);34 }35 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, WebDriver driver) {36 super(element, instantiator);37 }38 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, SearchContext searchContext) {39 super(element, instantiator);40 }41 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, SearchContext searchContext, WebDriver driver) {42 super(element, instantiator);43 }44 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, By locator) {45 super(element, instantiator);46 }47 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, By locator, WebDriver driver) {48 super(element, instantiator);49 }50 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, By locator, SearchContext searchContext) {51 super(element, instantiator);52 }53 public FluentWebElement(WebElement element, ComponentInstantiator instantiator, By locator, SearchContext searchContext, WebDriver

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1package com.fluentlenium;2import org.fluentlenium.core.FluentDriverComponentInstantiator;3import org.fluentlenium.core.components.DefaultComponentInstantiator;4import org.fluentlenium.core.components.DefaultComponentInstantiatorSupplier;5import org.fluentlenium.core.components.FluentComponent;6import org.fluentlenium.core.components.FluentComponentInstantiator;7import org.fluentlenium.core.domain.FluentWebElement;8import org.openqa.selenium.WebDriver;9public class AbstractFluentDriverComponentInstantiator extends FluentDriverComponentInstantiator implements DefaultComponentInstantiatorSupplier {10 public AbstractFluentDriverComponentInstantiator(WebDriver driver) {11 super(driver);12 }13 public DefaultComponentInstantiator getDefaultComponentInstantiator() {14 return new DefaultComponentInstantiator(this);15 }16 public <T extends FluentComponent> T newComponent(Class<T> componentClass, FluentWebElement element) {17 return getDefaultComponentInstantiator().newComponent(componentClass, element);18 }19 public <T extends FluentComponent> T newComponent(Class<T> componentClass, FluentWebElement element, FluentComponentInstantiator instantiator) {20 return getDefaultComponentInstantiator().newComponent(componentClass, element, instantiator);21 }22}23package com.fluentlenium;24import org.fluentlenium.core.FluentPage;25import org.fluentlenium.core.components.DefaultComponentInstantiatorSupplier;26import org.fluentlenium.core.components.FluentComponentInstantiator;27import org.fluentlenium.core.components.FluentComponentWithElements;28import org.openqa.selenium.WebDriver;29public abstract class AbstractFluentPage extends FluentPage implements DefaultComponentInstantiatorSupplier {30 public AbstractFluentPage(WebDriver driver) {31 super(driver);32 }33 public FluentComponentInstantiator getDefaultComponentInstantiator() {34 return new AbstractFluentDriverComponentInstantiator(getDriver());35 }36 public <T extends FluentComponentWithElements> T newComponent(Class<T> componentClass) {37 return getDefaultComponentInstantiator().newComponent(componentClass);38 }39 public <T extends FluentComponentWithElements> T newComponent(Class<T> componentClass, FluentComponentInstantiator instantiator) {40 return getDefaultComponentInstantiator().newComponent(componentClass, instantiator);41 }

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.FluentDriverComponentInstantiator;2import org.fluentlenium.core.FluentPage;3import org.openqa.selenium.WebDriver;4public class AbstractFluentDriverComponentInstantiator {5 public static void main(String[] args) {6 FluentPage page = new FluentPage() {7 public String getUrl() {8 }9 };10 WebDriver driver = null;11 FluentDriverComponentInstantiator instantiator = new FluentDriverComponentInstantiator(driver);12 instantiator.createPage(page);13 }14}15 at org.fluentlenium.core.FluentDriverComponentInstantiator.createPage(FluentDriverComponentInstantiator.java:63)16 at AbstractFluentDriverComponentInstantiator.main(AbstractFluentDriverComponentInstantiator.java:21)17import org.fluentlenium.core.FluentDriverComponentInstantiator;18import org.fluentlenium.core.FluentPage;19import org.openqa.selenium.WebDriver;20public class FluentDriverComponentInstantiator {21 public static void main(String[] args) {22 FluentPage page = new FluentPage() {23 public String getUrl() {24 }25 };26 WebDriver driver = null;27 FluentDriverComponentInstantiator instantiator = new FluentDriverComponentInstantiator(driver);28 instantiator.createPage(page);29 }30}31 at org.fluentlenium.core.FluentDriverComponentInstantiator.createPage(FluentDriverComponentInstantiator.java:63)32 at FluentDriverComponentInstantiator.main(FluentDriverComponentInstantiator.java:21)33import org.fluentlenium.core.FluentPage

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1package com.fluentlenium;2import org.fluentlenium.core.FluentDriverComponentInstantiator;3import org.fluentlenium.core.components.DefaultComponentInstantiator;4import org.fluentlenium.core.components.DefaultComponentInstantiatorSupplier;5import org.fluentlenium.core.components.FluentComponent;6import org.fluentlenium.core.components.FluentComponentInstantiator;7import org.fluentlenium.core.domain.FluentWebElement;8import org.openqa.selenium.WebDriver;9public class AbstractFluentDriverComponentInstantiator extends FluentDriverComponentInstantiator implements DefaultComponentInstantiatorSupplier {10 public AbstractFluentDriverComponentInstantiator(WebDriver driver) {11 super(driver);12 }13 public DefaultComponentInstantiator getDefaultComponentInstantiator() {14 return new DefaultComponentInstantiator(this);15 }16 public <T extends FluentComponent> T newComponent(Class<T> componentClass, FluentWebElement element) {17 return getDefaultComponentInstantiator().newComponent(componentClass, element);18 }19 public <T extends FluentComponent> T newComponent(Class<T> componentClass, FluentWebElement element, FluentComponentInstantiator instantiator) {20 return getDefaultComponentInstantiator().newComponent(componentClass, element, instantiator);21 }22}23package com.fluentlenium;24import org.fluentlenium.core.FluentPage;25import org.fluentlenium.core.components.DefaultComponentInstantiatorSupplier;26import org.fluentlenium.core.components.FluentComponentInstantiator;27import org.fluentlenium.core.components.FluentComponentWithElements;28import org.openqa.selenium.WebDriver;29public abstract class AbstractFluentPage extends FluentPage implements DefaultComponentInstantiatorSupplier {30 public AbstractFluentPage(WebDriver driver) {31 super(driver);32 }33 public FluentComponentInstantiator getDefaultComponentInstantiator() {34 return new AbstractFluentDriverComponentInstantiator(getDriver());35 }36 public <T extends FluentComponentWithElements> T newComponent(Class<T> componentClass) {37 return getDefaultComponentInstantiator().newComponent(componentClass);38 }39 public <T extends FluentComponentWithElements> T newComponent(Class<T> componentClass, FluentComponentInstantiator instantiator) {40 return getDefaultComponentInstantiator().newComponent(componentClass, instantiator);41 }

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.FluentDriverComponentInstantiator;2import org.fluentlenium.core.FluentPage;3import org.openqa.selenium.WebDriver;4public class AbstractFluentDriverComponentInstantiator {5 public static void main(String[] args) {6 FluentPage page = new FluentPage() {7 public String getUrl() {8 }9 };10 WebDriver driver = null;11 FluentDriverComponentInstantiator instantiator = new FluentDriverComponentInstantiator(driver);12 instantiator.createPage(page);13 }14}15 at org.fluentlenium.core.FluentDriverComponentInstantiator.createPage(FluentDriverComponentInstantiator.java:63)16 at AbstractFluentDriverComponentInstantiator.main(AbstractFluentDriverComponentInstantiator.java:21)17import org.fluentlenium.core.FluentDriverComponentInstantiator;18import org.fluentlenium.core.FluentPage;19import org.openqa.selenium.WebDriver;20public class FluentDriverComponentInstantiator {21 public static void main(String[] args) {22 FluentPage page = new FluentPage() {23 public String getUrl() {24 }25 };26 WebDriver driver = null;27 FluentDriverComponentInstantiator instantiator = new FluentDriverComponentInstantiator(driver);28 instantiator.createPage(page);29 }30}31 at org.fluentlenium.core.FluentDriverComponentInstantiator.createPage(FluentDriverComponentInstantiator.java:63)32 at FluentDriverComponentInstantiator.main(FluentDriverComponentInstantiator.java:21)33import org.fluentlenium.core.FluentPage

Full Screen

Full Screen

AbstractFluentDriverComponentInstantiator

Using AI Code Generation

copy

Full Screen

1package com.qait.automation.TestSessionInitiator;2import org.fluentlenium.core.FluentPage;3import org.fluentlenium.core.domain.FluentWebElement;4import org.fluentlenium.core.inject.FluentInjector;5import org.fluentlenium.core.inject.PageFactory;6import org.fluentlenium.core.inject.PageFactoryComponents;7import org.fluentlenium.core.search.Search;8import org.openqa.selenium.WebDriver;9public class FluentPageComponentInstantiator extends AbstractFluentDriverComponentInstantiator {10public FluentPageComponentInstantiator(WebDriver driver, Search search, FluentInjector injector) {11 super(driver, search, injector);12}13protected void initPage(FluentPage page) {14 PageFactory.initElements(new PageFactoryComponents(this), page);15}16protected void initElement(FluentWebElement element) {17}18}19package com.qait.automation.TestSessionInitiator;20import org.fluentlenium.core.Fluent;21import org.fluentlenium.core.FluentPage;22import org.fluentlenium.core.FluentTest;23import org.fluentlenium.core.hook.wait.WaitHook;24import org.fluentlenium.core.inject.FluentInjector;25import org.fluentlenium.core.search.Search;26import org.openqa.selenium.WebDriver;27public class FluentTestSessionInitiator {28private WebDriver webDriver;29private Fluent fluent;30private FluentTest fluentTest;31private FluentPage fluentPage;32private FluentPageComponentInstantiator fluentPageComponentInstantiator;33private FluentInjector fluentInjector;34private Search search;35private WaitHook waitHook;36public void startFluent() {37 webDriver = new WebDriverFactory().getDriver();38 fluent = new Fluent(webDriver);39 fluentPageComponentInstantiator = new FluentPageComponentInstantiator(webDriver, search, fluentInjector);40 fluentTest = new FluentTest(webDriver, fluentPageComponentInstantiator, fluentInjector, waitHook);41 fluentPage = new FluentPage(webDriver, fluentPageComponentInstantiator, fluentInjector, waitHook);42}43public void stopFluent() {44 webDriver.quit();45}46public Fluent getFluent() {47 return fluent;48}49public FluentTest getFluentTest() {50 return fluentTest;51}52public FluentPage getFluentPage() {53 return fluentPage;54}

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run FluentLenium automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Test Your Web Or Mobile Apps On 3000+ Browsers

Signup for free

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful