package org.fluentlenium.integration;
import net.jcip.annotations.NotThreadSafe;
import org.fluentlenium.core.FluentPage;
import org.fluentlenium.core.domain.FluentList;
import org.fluentlenium.core.domain.FluentWebElement;
import org.fluentlenium.integration.localtest.IntegrationFluentTest;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.TimeoutException;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.fluentlenium.core.filter.FilterConstructor.containingText;
import static org.fluentlenium.core.filter.FilterConstructor.with;
import static org.fluentlenium.core.filter.FilterConstructor.withClass;
import static org.fluentlenium.core.filter.FilterConstructor.withId;
import static org.fluentlenium.core.filter.FilterConstructor.withName;
import static org.fluentlenium.core.filter.FilterConstructor.withText;
import static org.fluentlenium.core.filter.FilterConstructor.withTextContent;
import static org.fluentlenium.core.filter.MatcherConstructor.regex;
import static org.junit.Assert.fail;
@NotThreadSafe
@SuppressWarnings({"PMD.GodClass", "PMD.ExcessivePublicCount"})
public class FluentLeniumFunctionalWaitTest extends IntegrationFluentTest {
@Before
public void before() {
goTo(DEFAULT_URL);
}
@Test
public void checkAwaitIsPresent() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small")).present();
}
@Test
public void checkAwaitIsClickable() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small")).clickable();
}
@Test(expected = TimeoutException.class)
public void checkAwaitDisabledIsClickableThrowTimeoutException() {
await().atMost(1, NANOSECONDS).untilElement(() -> el("input[disabled]")).clickable();
}
@Test
public void checkAwaitHasSize() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small");
}
}).size(3);
}
@Test
public void checkAwaitHasTextWithText() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withText("Small 1"))).text().equalTo("Small 1");
}
@Test
public void checkAwaitContainsNameWithName() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withName("name"))).name("name");
}
@Test
public void checkAwaitContainsNameWithClass() {
await().atMost(1, NANOSECONDS).untilElement(() -> el("span", withClass("small"))).name("name");
}
@Test
public void checkAwaitContainsNameWithClassRegex() {
await().atMost(1, NANOSECONDS).untilElement(() -> el("span", withClass().contains(regex("smal?")))).name("name");
}
@Test
public void checkAwaitContainsNameWithClassAndContainsWord() {
await().atMost(1, NANOSECONDS).untilElement(() -> el("span", withClass().containsWord("small"))).name("name");
}
@Test
public void checkAwaitContainsTextWithText() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withText("Small 1"), containingText("Small 1")));
}
@Test
public void checkUseCustomMessage() {
try {
await().withMessage("toto").atMost(1, NANOSECONDS).untilElement(() -> el(".small", withText("Small 1"))).text()
.contains("Small 21");
fail();
} catch (TimeoutException e) {
assertThat(e.getMessage()).contains("toto");
}
}
@Test
public void checkAwaitContainsText() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small")).text().contains("Small 1");
}
@Test
public void checkAwaitContainsIdWithId() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withId("id2"))).id("id2");
}
@Test
public void checkAwaitStartsWithName() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", withName().startsWith("name"));
}
}).size(2);
}
@Test
public void checkAwaitContainsIdWithIdContains() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", withId().contains("id"));
}
}).size(2);
}
@Test
public void checkAwaitHasText() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small")).text("Small 1");
}
@Test
public void checkAwaitContainsName() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small")).name("name");
}
@Test
public void checkAwaitContainsId() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small");
}
}).id("id2");
}
@Test
public void checkAwaitContainsTextWithTextMatcher() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withText().contains("Small 1"))).present();
}
@Test
public void checkAwaitContainsTextWithTextContentMatcher() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withTextContent().contains("Small 1"))).present();
}
@Test
public void whenAElementIsNotPresentThenIsNotPresentReturnTrue() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", withText().contains("notPresent"));
}
}).not().present();
}
@Test(expected = TimeoutException.class)
public void whenAElementIsPresentThenIsNotPresentThrowAnException() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", withText().contains("Small 1"))).not().present();
}
@Test
public void checkAwaitStartWithRegex() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").startsWith(regex(".d")));
}
}).size(2);
}
@Test
public void checkAwaitStartWithString() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").startsWith("id"));
}
}).size(2);
}
@Test
public void checkAwaitNotStartWith() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notStartsWith("id"));
}
}).size(1);
}
@Test
public void checkAwaitNotStartWithRegex() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notStartsWith(regex("id")));
}
}).size(1);
}
@Test
public void checkAwaitEndsWithRegex() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").endsWith(regex("2")));
}
}).size(1);
}
@Test
public void checkAwaitNotEndsWith() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", with("id").notEndsWith("2"))).id("id");
}
@Test
public void checkAwaitNotEndsWithRegex() {
await().atMost(1, NANOSECONDS).untilElement(() -> el(".small", with("id").notEndsWith(regex("2")))).id("id");
}
@Test
public void checkAwaitNotContains() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size(1);
}
@Test
public void checkAwaitNotContainsRegex() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains(regex("d")));
}
}).size(1);
}
@Test
public void checkAwaitEquals() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size().equalTo(1);
}
@Test
public void checkAwaitNotEquals() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size().not().equalTo(10);
}
@Test
public void checkAwaitLessThan() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size().lessThan(4);
}
@Test
public void checkAwaitLessThanOrEquals() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size().lessThanOrEqualTo(1);
}
@Test
public void checkAwaitGreaterThan() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size().greaterThan(-1);
}
@Test
public void checkAwaitGreaterThanOrEquals() {
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").notContains("d"));
}
}).size().greaterThanOrEqualTo(1);
}
@Test
public void checkWithValue() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("input", with("value").equalTo("John"));
}
}).size(4);
}
@Test
public void checkMultipleFilter() {
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find(".small", with("id").startsWith(regex("id")), with("text").endsWith("2"));
}
}).size(1);
}
@Test
public void checkHasAttribute() {
await().atMost(1, NANOSECONDS).untilElement(() -> el("input")).attribute("value", "John");
}
@Test
public void checkHasAttributeWithOthersFilters() {
await().atMost(1, NANOSECONDS).untilElement(() -> el("input", with("value").equalTo("John"))).attribute("value", "John");
}
@Test
public void whenElementIsPresentThenAreDisplayedReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).displayed();
}
@Test
public void whenElementIsPresentThenIsDisplayedReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).displayed();
}
@Test(expected = TimeoutException.class)
public void whenElementIsNotDisplayedThenAreDisplayedThrowsException() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#unvisible");
}
}).displayed();
}
@Test(expected = TimeoutException.class)
public void whenElementIsNotDisplayedThenIsDisplayedThrowsException() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#unvisible");
}
}).displayed();
}
@Test
public void whenElementIsNotPresentThenAreNotDisplayedReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#nonexistent");
}
}).not().displayed();
}
@Test
public void whenElementIsNotPresentThenIsNotDisplayedReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#nonexistent");
}
}).not().displayed();
}
@Test
public void whenElementIsNotDisplayedThenAreNotDisplayedReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#unvisible");
}
}).not().displayed();
}
@Test
public void whenElementIsNotDisplayedThenIsNotDisplayedReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#unvisible");
}
}).not().displayed();
}
@Test(expected = TimeoutException.class)
public void whenElementIsDisplayedThenAreNotDisplayedThrowsException() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).not().displayed();
}
@Test(expected = TimeoutException.class)
public void whenElementIsDisplayedThenIsNotDisplayedThrowsException() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).not().displayed();
}
@Test
public void whenElementIsEnabledThenAreEnabledReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).enabled();
}
@Test
public void whenElementIsEnabledThenIsEnabledReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).enabled();
}
@Test(expected = TimeoutException.class)
public void whenElementIsNotEnabledThenAreEnabledThrowsException() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilEachElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#disabled");
}
}).enabled();
}
@Test(expected = TimeoutException.class)
public void whenElementIsNotEnabledThenIsEnabledThrowsException() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#disabled");
}
}).enabled();
}
@Test
public void whenElementIsNotDisplayedThenIsPresentReturnTrue() {
goTo(JAVASCRIPT_URL);
await().atMost(1, NANOSECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#unvisible");
}
}).present();
}
@Test(expected = TimeoutException.class)
public void checkPolling() {
goTo(JAVASCRIPT_URL);
await().pollingEvery(1500, TimeUnit.MILLISECONDS).untilElements(new Supplier<FluentList<FluentWebElement>>() {
@Override
public FluentList<FluentWebElement> get() {
return find("#default");
}
}).text().equalTo("wait");
}
private static class MyFluentPage extends FluentPage {
@Override
public void isAt() {
assertThat(find("#newField").texts()).contains("new");
}
@Override
public String getUrl() {
return IntegrationFluentTest.JAVASCRIPT_URL;
}
}
}