How to use FilterConstructor class of org.fluentlenium.core.filter package

Best FluentLenium code snippet using org.fluentlenium.core.filter.FilterConstructor

Source:FullWorkflowTest.java Github

copy

Full Screen

2import com.google.common.base.Predicate;3import external.AbstractVagrantTest;4import org.fluentlenium.core.domain.FluentList;5import org.fluentlenium.core.domain.FluentWebElement;6import org.fluentlenium.core.filter.FilterConstructor;7import org.junit.AfterClass;8import org.junit.BeforeClass;9import org.junit.Test;10import static external.AbstractVagrantTest.checkIfVagrantTestsExcluded;11import static external.AbstractVagrantTest.vagrantTestsExcluded;12import static java.util.concurrent.TimeUnit.MILLISECONDS;13import static java.util.concurrent.TimeUnit.SECONDS;14import static org.fest.assertions.Assertions.assertThat;15import static org.fluentlenium.core.filter.FilterConstructor.withText;16public class FullWorkflowTest extends AbstractSeleniumTest {17 private static final String username = "demo";18 private static final String password = "demo";19 private static final String VAGRANT_PATH = "test/tools/vagrants/ADRepo";20 @BeforeClass21 public static void startApp() {22 if (!vagrantTestsExcluded()) {23 AbstractVagrantTest.vagrantUp(VAGRANT_PATH);24 }25 }26 @AfterClass27 public static void stopApp() {28 if (!vagrantTestsExcluded()) {29 AbstractVagrantTest.vagrantDestroy(VAGRANT_PATH);30 }31 }32 @Override33 public void setUp() {34 super.setUp();35 }36 @Override37 public void tearDown() {38 super.tearDown();39 }40 @Test41 public void registerAndLoginTest() {42 String username = "New User";43 String password = "1234";44 browser.goTo("/");45 browser.click("a", withText("Account"));46 browser.await().untilPage().isLoaded();47 browser.fill("#registerUserName").with(username);48 browser.fill("#registerPassword").with(password);49 browser.fill("#registerPasswordRepeat").with(password);50 browser.click("button", withText().contains("Register"));51 await(() -> browser.find(".messagebox.success", withText("Registration successful.")));52 doLogin(username, password);53 await(() -> browser.find("a", withText("Problems & Task Templates")));54 await(() -> browser.find("a", withText("Administration")));55 browser.click("button", withText("Logout"));56 assertThat(browser.find("a", withText("Problems & Task Templates"))).isEmpty();57 assertThat(browser.find("a", withText("Administration"))).isEmpty();58 }59 private FluentList<FluentWebElement> await(Await await) {60 browser.await().pollingEvery(50, MILLISECONDS).atMost(30, SECONDS).until((Predicate) input -> {61 browser.await().untilPage().isLoaded();62 try {63 return !await.element().isEmpty();64 } catch (org.openqa.selenium.StaleElementReferenceException sere) {65 return false;66 }67 });68 return await.element();69 }70 private interface Await {71 public FluentList<FluentWebElement> element();72 }73 private void doLogin(String username, String password) {74 browser.fill("input", FilterConstructor.with("placeholder").equalTo("username")).with(username);75 browser.fill("input", FilterConstructor.with("placeholder").equalTo("password")).with(password);76 browser.click("button", withText("Login"));77 }78 @Test79 public void mapSomethingTest() {80 //Setup81 checkIfVagrantTestsExcluded("selenium.FullWorkflowTest.mapSomethingTest");82 browser.goTo("/");83 doLogin(username, password);84 await(() -> browser.find("a", withText("Problems & Task Templates")));85 //Test86 browser.click("a", withText("Problems & Task Templates"));87 await(() -> browser.find("span", withText().contains("Amount of (Desired) Automation"))).click();88 await(() -> browser.find("p", withText("Should the business process (a.k.a. workflow) be fully or partially automated?")));89 browser.find("li", withText().contains("Define criterion values")).findFirst("button", withText("< Map")).click();90 browser.find("li", withText().contains("Define criterions")).findFirst("button", withText("< Map")).click();91 browser.find("li", withText().contains("Install DB")).findFirst("button", withText("< Map")).click();92 browser.find(".ProblemDetail li", withText().contains("Install DB")).findFirst("button", withText().contains("Unmap")).click();93 browser.fill("input", FilterConstructor.with("placeholder").equalTo("Name")).with("Hold final decision meeting");94 browser.click("button", withText().contains("Create"));95 await(() -> browser.find("#newTaskPropertySelect"));96 browser.fillSelect("#newTaskPropertySelect").withText("Assignee");97 browser.fill("input", FilterConstructor.with("placeholder").equalTo("New Assignee")).with("Developer");98 browser.click("button", withText().contains("Add"));99 browser.find("li", withText().contains("Hold final decision meeting")).findFirst("button", withText("< Map")).click();100 assertThat(await(() -> browser.find(".propertyValues input")).getValue()).isEqualTo("Developer");101 //Cleanup102 browser.click("button", withText("Logout"));103 }104 @Test105 public void transmitSomethingTest() {106 //Setup107 checkIfVagrantTestsExcluded("selenium.FullWorkflowTest.mapSomethingTest");108 browser.goTo("/");109 doLogin(username, password);110 await(() -> browser.find("a", withText("Transmission")));111 //Test (Select Input Data)...

Full Screen

Full Screen

Source:FluentLeniumAdapter.java Github

copy

Full Screen

...76 methodAdd("org.fluentlenium.core.domain.FluentWebElement", "getValue");77 methodAdd("org.fluentlenium.core.domain.FluentWebElement", "isDisplayed");78 methodAdd("org.fluentlenium.core.domain.FluentWebElement", "isEnabled");79 methodAdd("org.fluentlenium.core.domain.FluentWebElement", "isSelected");80 methodAdd("org.fluentlenium.core.filter.FilterConstructor", "withClass", "String", CaptureStyle.NONE);81 methodAdd("org.fluentlenium.core.filter.FilterConstructor", "withName", "String", CaptureStyle.NONE);82 methodAdd("org.fluentlenium.core.filter.FilterConstructor", "withText", "String", CaptureStyle.NONE);83 methodAdd("org.fluentlenium.core.Fluent", "$", "String,org.fluentlenium.core.filter.Filter[]", 1);84 methodAdd("org.fluentlenium.core.Fluent", "$", "String,java.lang.Integer,org.fluentlenium.core.filter.Filter[]", 2);85 methodAdd("org.fluentlenium.core.Fluent", "clear", 1);86 methodAdd("org.fluentlenium.core.Fluent", "click", 1);87 methodAdd("org.fluentlenium.core.Fluent", "executeScript", 1);88 methodAdd("org.fluentlenium.core.Fluent", "fill", 1);89 methodAdd("org.fluentlenium.core.Fluent", "find", "String,org.fluentlenium.core.filter.Filter[]", 1);90 methodAdd("org.fluentlenium.core.Fluent", "find", "String,java.lang.Integer,org.fluentlenium.core.filter.Filter[]", 2);91 methodAdd("org.fluentlenium.core.Fluent", "findFirst", "String,org.fluentlenium.core.filter.Filter[]", 1);92 methodAdd("org.fluentlenium.core.Fluent", "goTo", "String");93 methodAdd("org.fluentlenium.core.Fluent", "goTo", "org.fluentlenium.core.FluentPage");94 methodAdd("org.fluentlenium.core.Fluent", "takeScreenShot", "String");95 methodAdd("org.fluentlenium.core.Fluent", "title");96 methodAdd("org.fluentlenium.core.FluentPage", "go");...

Full Screen

Full Screen

Source:BasicModule.java Github

copy

Full Screen

...4import org.fluentlenium.core.domain.FluentList;5import org.fluentlenium.core.domain.FluentWebElement;6import org.openqa.selenium.Keys;7import org.openqa.selenium.WebElement;8import static org.fluentlenium.core.filter.FilterConstructor.withClass;9import static org.fluentlenium.core.filter.FilterConstructor.withText;10public class BasicModule extends FluentWebElement11{12 public BasicModule(WebElement element, FluentControl control, ComponentInstantiator instantiator)13 {14 super(element, control, instantiator);15 }16}...

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1import org.fluentlenium.core.filter.FilterConstructor;2import org.junit.Test;3import org.openqa.selenium.By;4import org.openqa.selenium.support.ui.ExpectedConditions;5import org.openqa.selenium.support.ui.WebDriverWait;6import org.fluentlenium.core.filter.Filter;7public class 4 extends Base {8public void test4() {9$(By.name("q")).click();10$(By.name("q")).sendKeys("Fluentlenium");11$(By.name("btnK")).click();12new WebDriverWait(getDriver(), 10).until(ExpectedConditions.presenceOfElementLocated(By.id("resultStats")));13String result = $(By.id("resultStats")).getText();14System.out.println(result);15}16}17import org.fluentlenium.core.filter.FilterConstructor;18import org.junit.Test;19import org.openqa.selenium.By;20import org.openqa.selenium.support.ui.ExpectedConditions;21import org.openqa.selenium.support.ui.WebDriverWait;22import org.fluentlenium.core.filter.Filter;23public class 5 extends Base {24public void test5() {25$(By.name("q")).click();26$(By.name("q")).sendKeys("Fluentlenium");27$(By.name("btnK")).click();28new WebDriverWait(getDriver(), 10).until(ExpectedConditions.presenceOfElementLocated(By.id("resultStats")));29String result = $(By.id("resultStats")).getText();

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package com.automationrhapsody.fluentlenium;2import org.fluentlenium.core.filter.FilterConstructor;3import org.junit.Test;4import org.junit.runner.RunWith;5import org.openqa.selenium.By;6import org.openqa.selenium.WebDriver;7import org.openqa.selenium.WebElement;8import org.openqa.selenium.firefox.FirefoxDriver;9import org.openqa.selenium.support.FindBy;10import org.openqa.selenium.support.FindBys;11import org.openqa.selenium.support.How;12import org.openqa.selenium.support.PageFactory;13import org.openqa.selenium.support.ui.Select;14import org.openqa.selenium.support.ui.WebDriverWait;15import org.springframework.beans.factory.annotation.Autowired;16import org.springframework.boot.test.context.SpringBootTest;17import org.springframework.test.context.junit4.SpringRunner;18import java.util.List;19import static org.fluentlenium.core.filter.FilterConstructor.*;20import static org.junit.Assert.assertEquals;21import static org.junit.Assert.assertTrue;22@RunWith(SpringRunner.class)23public class FluentleniumApplicationTests {24 private WebDriver driver;25 public void test() {26 assertEquals("Fluentlenium Application", driver.getTitle());27 WebElement searchTextBox = driver.findElement(By.id("search"));28 searchTextBox.sendKeys("Fluentlenium");29 WebElement searchButton = driver.findElement(By.id("search-button"));30 searchButton.click();31 WebElement searchResult = driver.findElement(By.id("search-result"));32 assertTrue(searchResult.getText().contains("Fluentlenium"));33 }34}35package com.automationrhapsody.fluentlenium;36import org.fluentlenium.core.filter.FilterConstructor;37import org.junit.Test;38import org.junit.runner.RunWith;39import org.openqa.selenium.By;40import org.openqa.selenium.WebDriver;41import org.openqa.selenium.WebElement;42import org.openqa.selenium.firefox.FirefoxDriver;43import org.openqa.selenium.support.FindBy;44import org.openqa.selenium.support.FindBys;45import org.openqa.selenium.support.How;46import org.openqa.selenium.support.PageFactory;47import org.openqa.selenium.support.ui.Select;48import org.openqa.selenium.support.ui.WebDriverWait;49import org.springframework.beans.factory.annotation.Autowired;50import org.springframework

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package org.fluentlenium.core.filter;2import org.fluentlenium.core.filter.matcher.*;3import java.lang.reflect.InvocationTargetException;4import java.lang.reflect.Method;5import java.util.ArrayList;6import java.util.List;7public class FilterConstructor {8 private final List<Filter> filters = new ArrayList<Filter>();9 public FilterConstructor() {10 }11 public FilterConstructor(Filter filter) {12 filters.add(filter);13 }14 public FilterConstructor(FilterConstructor filterConstructor) {15 filters.addAll(filterConstructor.getFilters());16 }17 public FilterConstructor filter(Filter filter) {18 filters.add(filter);19 return this;20 }21 public FilterConstructor filter(FilterConstructor filterConstructor) {22 filters.addAll(filterConstructor.getFilters());23 return this;24 }25 public List<Filter> getFilters() {26 return filters;27 }28 public FilterConstructor and() {29 filters.add(Filter.and());30 return this;31 }32 public FilterConstructor or() {33 filters.add(Filter.or());34 return this;35 }36 public FilterConstructor not() {37 filters.add(Filter.not());38 return this;39 }40 public FilterConstructor and(Filter filter) {41 filters.add(Filter.and());42 filters.add(filter);43 return this;44 }45 public FilterConstructor and(FilterConstructor filterConstructor) {46 filters.add(Filter.and());47 filters.addAll(filterConstructor.getFilters());48 return this;49 }50 public FilterConstructor or(Filter filter) {51 filters.add(Filter.or());52 filters.add(filter);53 return this;54 }55 public FilterConstructor or(FilterConstructor filterConstructor) {56 filters.add(Filter.or());57 filters.addAll(filterConstructor.getFilters());58 return this;59 }60 public FilterConstructor not(Filter filter) {61 filters.add(Filter.not());62 filters.add(filter);63 return this;64 }65 public FilterConstructor not(FilterConstructor filterConstructor) {66 filters.add(Filter.not());67 filters.addAll(filterConstructor.getFilters());68 return this;69 }70 public FilterConstructor withText(String text) {71 filters.add(Filter.withText(text));72 return this;73 }74 public FilterConstructor withText(Matcher matcher) {75 filters.add(Filter.withText(matcher));76 return this;77 }78 public FilterConstructor withText() {79 filters.add(Filter.withText());80 return this;81 }82 public FilterConstructor withId(String id) {83 filters.add(Filter.withId(id));84 return this;85 }86 public FilterConstructor withId(Matcher matcher

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package com.seleniumeasy;2import org.fluentlenium.core.filter.FilterConstructor;3import org.junit.Test;4import org.openqa.selenium.By;5import org.openqa.selenium.WebElement;6import org.openqa.selenium.support.FindBy;7import java.util.List;8import static org.junit.Assert.assertEquals;9public class FilterConstructorTest extends BaseTest {10 @FindBy(css = ".table-hover")11 private WebElement table;12 public void testFilterConstructor() {13 List<WebElement> row = table.findElements(new FilterConstructor(By.cssSelector("tr"))14 .withText("Jackson"));15 assertEquals(1, row.size());16 }17}18package com.seleniumeasy;19import org.fluentlenium.core.filter.FilterConstructor;20import org.junit.Test;21import org.openqa.selenium.By;22import org.openqa.selenium.WebElement;23import org.openqa.selenium.support.FindBy;24import java.util.List;25import static org.junit.Assert.assertEquals;26public class FilterConstructorTest extends BaseTest {27 @FindBy(css = ".table-hover")28 private WebElement table;29 public void testFilterConstructor() {30 List<WebElement> row = table.findElements(new FilterConstructor(By.cssSelector("tr"))31 .withAttribute("data-name", "Jackson"));32 assertEquals(1, row.size());33 }34}

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1public class 4 {2 public static void main(String[] args) {3 FluentDriver driver = new FluentDriver();4 driver.init();5 driver.fill("#lst-ib").with("FluentLenium");6 driver.submit("#lst-ib");7 driver.$("a", withText("FluentLenium")).click();8 driver.$("#mainContent").$("h1", withText("FluentLenium")).click();9 driver.quit();10 }11}12public class 5 {13 public static void main(String[] args) {14 FluentDriver driver = new FluentDriver();15 driver.init();16 driver.fill("#lst-ib").with("FluentLenium");17 driver.submit("#lst-ib");18 driver.$("a", withText("FluentLenium")).click();19 driver.$("#mainContent").$("h1", withText("FluentLenium")).click();20 driver.quit();21 }22}23public class 6 {24 public static void main(String[] args) {25 FluentDriver driver = new FluentDriver();26 driver.init();27 driver.fill("#lst-ib").with("FluentLenium");28 driver.submit("#lst-ib");29 driver.$("a", withText("FluentLenium")).click();30 driver.$("#mainContent").$("h1", withText("FluentLenium")).click();31 driver.quit();32 }33}34public class 7 {35 public static void main(String[] args) {36 FluentDriver driver = new FluentDriver();37 driver.init();38 driver.fill("#lst-ib").with("FluentLenium");39 driver.submit("#lst-ib");40 driver.$("a", withText("FluentLenium")).click();41 driver.$("#mainContent").$("h1", withText("FluentLenium")).click();42 driver.quit();43 }44}

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package com.qainfotech.tap.training.resourceio;2import java.io.IOException;3import java.util.ArrayList;4import java.util.Arrays;5import java.util.List;6import java.util.Map;7import java.util.Map.Entry;8import java.util.Set;9import java.util.stream.Collectors;10import org.fluentlenium.core.filter.FilterConstructor;11import org.json.JSONArray;12import org.json.JSONObject;13import org.openqa.selenium.By;14import org.openqa.selenium.NoSuchElementException;15import org.openqa.selenium.WebDriver;16import org.openqa.selenium.WebElement;17import org.openqa.selenium.chrome.ChromeDriver;18import org.openqa.selenium.support.ui.Select;19public class OperationsOnString {20 public static void main(String[] args) throws IOException {21 FilterConstructor f = new FilterConstructor();22 WebDriver driver = new ChromeDriver();23 driver.manage().window().maximize();24 wb.click();25 wb1.sendKeys("mobiles");26 wb2.click();27 wb3.click();

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package org.fluentlenium.core.filter;2import org.fluentlenium.core.domain.FluentWebElement;3import org.junit.Test;4import org.junit.runner.RunWith;5import org.openqa.selenium.support.FindBy;6import org.openqa.selenium.support.How;7import org.openqa.selenium.support.ui.Select;8import org.springframework.beans.factory.annotation.Autowired;9import org.springframework.boot.test.context.SpringBootTest;10import org.springframework.test.context.junit4.SpringRunner;11import org.springframework.test.context.web.WebAppConfiguration;12import static org.assertj.core.api.Assertions.assertThat;13@RunWith(SpringRunner.class)14public class FilterConstructorTest {15 private FilterConstructor filterConstructor;16 @FindBy(how = How.CSS, using = "input")17 private FluentWebElement input;18 @FindBy(how = How.CSS, using = "select")19 private FluentWebElement select;20 @FindBy(how = How.CSS, using = "textarea")21 private FluentWebElement textarea;22 @FindBy(how = How.CSS, using = "button")23 private FluentWebElement button;24 @FindBy(how = How.CSS, using = "input[type='checkbox']")25 private FluentWebElement checkbox;26 @FindBy(how = How.CSS, using = "input[type='radio']")27 private FluentWebElement radio;28 @FindBy(how = How.CSS, using = "input[type='file']")29 private FluentWebElement file;30 @FindBy(how = How.CSS, using = "input[type='submit']")31 private FluentWebElement submit;32 @FindBy(how = How.CSS, using = "input[type='reset']")33 private FluentWebElement reset;34 @FindBy(how = How.CSS, using = "input[type='image']")35 private FluentWebElement image;36 @FindBy(how = How.CSS, using = "input[type='hidden']")37 private FluentWebElement hidden;38 @FindBy(how = How.CSS, using = "input[type='password']")39 private FluentWebElement password;40 @FindBy(how = How.CSS, using = "input[type='search']")41 private FluentWebElement search;42 @FindBy(how = How.CSS, using = "input[type='tel']")43 private FluentWebElement tel;44 @FindBy(how = How.CSS, using = "input[type='url']")45 private FluentWebElement url;46 @FindBy(how = How.CSS, using = "input[type='email']")47 private FluentWebElement email;48 @FindBy(how

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package com.javatpoint;2 import org.fluentlenium.core.filter.FilterConstructor;3 import org.junit.Test;4 import org.openqa.selenium.By;5 import static org.assertj.core.api.Assertions.assertThat;6 public class FilterConstructorExample extends FluentTest {7 public void testFilterConstructor() {8 $( "a" , FilterConstructor.withText( "Java" )).click();9 assertThat($(By.tagName( "h1" )).text()).contains( "Java" );10 }11}12package com.javatpoint;13 import org.junit.Test;14 import static org.assertj.core.api.Assertions.assertThat;15 import org.fluentlenium.core.filter.FilterConstructor;16 import org.openqa.selenium.By;17 public class FilterConstructorExample extends FluentTest {18 public void testFilterConstructor() {19 $( "a" , FilterConstructor.withText( "Java" )).click();20 assertThat($(By.tagName( "h1" )).text()).contains( "Java" );21 }22}

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1public class 4 {2 public static void main(String[] args) {3 FilterConstructor filterConstructor = new FilterConstructor();4 filterConstructor.withFilter("name", "value");5 }6}

Full Screen

Full Screen

FilterConstructor

Using AI Code Generation

copy

Full Screen

1package org.fluentlenium.core.filter;2import org.fluentlenium.core.filter.matcher.*;3import org.openqa.selenium.By;4public class FilterConstructor {5 private FilterConstructor() {}6 public static FilterBuilder id() {7 return new FilterBuilder(new IdMatcher());8 }9 public static FilterBuilder id(String id) {10 return new FilterBuilder(new IdMatcher(), id);11 }12 public static FilterBuilder name() {13 return new FilterBuilder(new NameMatcher());14 }15 public static FilterBuilder name(String name) {16 return new FilterBuilder(new NameMatcher(), name);17 }18 public static FilterBuilder className() {19 return new FilterBuilder(new ClassNameMatcher());20 }21 public static FilterBuilder className(String className) {22 return new FilterBuilder(new ClassNameMatcher(), className);23 }24 public static FilterBuilder text() {25 return new FilterBuilder(new TextMatcher());26 }27 public static FilterBuilder text(String text) {28 return new FilterBuilder(new TextMatcher(), text);29 }30 public static FilterBuilder value() {31 return new FilterBuilder(new ValueMatcher());32 }33 public static FilterBuilder value(String value) {34 return new FilterBuilder(new ValueMatcher(), value);35 }36 public static FilterBuilder css() {37 return new FilterBuilder(new CssMatcher());38 }39 public static FilterBuilder css(String css) {40 return new FilterBuilder(new CssMatcher(), css);41 }42 public static FilterBuilder tagName() {43 return new FilterBuilder(new TagNameMatcher());44 }45 public static FilterBuilder tagName(String tagName) {46 return new FilterBuilder(new TagNameMatcher(), tagName);47 }48 public static FilterBuilder attribute() {49 return new FilterBuilder(new AttributeMatcher());50 }51 public static FilterBuilder attribute(String attribute) {52 return new FilterBuilder(new AttributeMatcher(), attribute);53 }54 public static FilterBuilder attribute(String attribute, String value) {55 return new FilterBuilder(new AttributeMatcher(), attribute, value);56 }57 public static FilterBuilder attribute(String attribute, String value, boolean partial) {58 return new FilterBuilder(new AttributeMatcher(), attribute, value, partial);59 }60 public static FilterBuilder attribute(String attribute, String value, boolean partial, boolean caseSensitive) {61 return new FilterBuilder(new Attribute

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