FluentLenium/FluentLenium

View on GitHub
fluentlenium-integration-tests/src/test/java/io/fluentlenium/test/await/FluentLeniumWaitTest.java

Summary

Maintainability
D
2 days
Test Coverage
package io.fluentlenium.test.await;

import io.fluentlenium.core.FluentPage;
import io.fluentlenium.core.filter.FilterConstructor;
import io.fluentlenium.core.filter.MatcherConstructor;
import io.fluentlenium.test.IntegrationFluentTest;
import net.jcip.annotations.NotThreadSafe;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.support.ui.FluentWait;

import java.util.concurrent.TimeUnit;

import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.fail;

@NotThreadSafe
@SuppressWarnings("PMD.Excessiveount")
class FluentLeniumWaitTest extends IntegrationFluentTest {

    private static final int MINIMAL_TIMEOUT = 1;
    private static final int SECOND_TIMEOUT = 1000;
    private static final int SMALL_EXPECTED_SIZE = 3;
    private static final int FIVE_SECONDS_TIMEOUT = 5;
    private static final int EXACTLY_ONE = 1;
    private static final int INVALID_EQUALS_NUMBER = 10;
    private static final int LESS_THAN_FOUR = 4;
    private static final int LESS_THAN_OR_EQ_1 = 1;
    private static final int GREATER_THAN_MINUS_ONE = -1;
    private static final int JOHN_FOUR_MATCHED = 4;
    private static final int ONLY_ONE_ENDS_WITH_TWO = 1;
    private static final int SECOND_AND_A_HALF_TIMEOUT = 1500;
    private static final int LESS_THAN_SECOND_TIMEOUT = 800;

    @BeforeEach
    void before() {
        goTo(DEFAULT_URL);
    }

    @Test
    void checkAwaitIsPresent() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).present();
    }

    @Test
    void checkAwaitIsNotPresent() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".not-present")).not().present();
    }

    @Test
    void checkAwaitIsDisplayed() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).displayed();
    }

    @Test
    void checkAwaitIsNotDisplayed() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#hidden")).not().displayed();
    }

    @Test
    void checkAwaitIsClickable() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).clickable();
    }

    @Test
    void checkAwaitIsNotClickable() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("input[disabled]")).not().clickable();
    }

    @Test
    void checkAwaitIsSelected() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#selected")).selected();
    }

    @Test
    void checkAwaitIsNotSelected() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#non_selected")).not().selected();
    }

    @Test
    void checkAwaitDisabledIsClickableThrowTimeoutException() {
        assertThrows(TimeoutException.class,
                () -> await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                        .until($("input[disabled]")).clickable());
    }

    @Test
    void explicitWait() {
        await().explicitlyFor(MINIMAL_TIMEOUT, NANOSECONDS);
    }

    @Test
    void explicitWaitMillis() {
        await().explicitlyFor(MINIMAL_TIMEOUT);
    }

    @Test
    void checkAwaitHasSize() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small")).size(SMALL_EXPECTED_SIZE);
    }

    @Test
    void checkAwaitHasTextWithText() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withText("Small 1"))).text().equalTo("Small 1");
    }

    @Test
    void checkAwaitContainsNameWithName() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withName("name"))).name("name");
    }

    @Test
    void checkAwaitContainsNameWithClass() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("span", FilterConstructor.withClass("small"))).name("name");
    }

    @Test
    void checkAwaitContainsNameWithClassRegex() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("span", FilterConstructor.withClass().contains(MatcherConstructor.regex("smal?")))).name("name");
    }

    @Test
    void checkAwaitContainsNameWithClassAndContainsWord() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("span", FilterConstructor.withClass().containsWord("small"))).name("name");
    }

    @Test
    void checkAwaitContainsTextWithText() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withText("Small 1"))).text().contains("Small 1");
    }

    @Test
    void checkUseCustomMessage() {
        try {
            await().withMessage("toto").atMost(1, NANOSECONDS).until($(".small", FilterConstructor.withText("Small 1"))).text()
                    .contains("Small 21");
            fail();
        } catch (TimeoutException e) {
            assertThat(e.getMessage()).contains("toto");
        }
    }

    @Test
    void checkAwaitPageToLoad() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilPage().isLoaded();
    }

    @Test
    void checkAwaitPageIsAt() {
        FluentPage isAtJavascriptPage = newInstance(MyFluentPage.class);
        isAtJavascriptPage.go();
        await().atMost(FIVE_SECONDS_TIMEOUT, TimeUnit.SECONDS).untilPage(isAtJavascriptPage).isAt();
    }

    @Test
    void checkAwaitContainsText() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).text().contains("Small 1");
    }

    @Test
    void checkAwaitContainsTextAlternative() {
        $(".small").await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until().text().contains("Small 1");
        $(".small", FilterConstructor.withText("Small 1")).await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach().text().contains("Small 1");
        el(".small").await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until().text().contains("Small 1");
    }

    @Test
    void checkAwaitContainsIdWithId() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withId("id2"))).id("id2");
    }

    @Test
    void checkAwaitNameStartsWith() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.withName().startsWith("name"))).size(2);
    }

    @Test
    void checkAwaitContainsIdWithIdContains() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.withId().contains("id"))).size(2);
    }

    @Test
    void checkAwaitHasText() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).text().equalTo("Small 1");
    }

    @Test
    void checkAwaitContainsName() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).name("name");
    }

    @Test
    void checkAwaitContainsId() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small")).id("id2");
    }

    @Test
    void checkAwaitContainsTextWithTextMatcher() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withText().contains("Small 1"))).present();
    }

    @Test
    void checkAwaitContainsTextWithTextContentMatcher() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withTextContent().contains("Small 1"))).present();
    }

    @Test
    void whenAElementIsNotPresentThenIsNotPresentReturnTrue() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.withText().contains("notPresent"))).not().present();
    }

    @Test
    void whenAElementIsPresentThenIsNotPresentThrowAnException() {
        assertThrows(TimeoutException.class,
                () -> await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                        .until($(".small", FilterConstructor.withText().contains("Small 1")))
                        .not().present());
    }

    @Test
    void checkAwaitStartWithRegex() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").startsWith(MatcherConstructor.regex(".d")))).size(2);
    }

    @Test
    void checkAwaitStartWithString() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").startsWith("id"))).size(2);
    }

    @Test
    void checkAwaitNotStartWith() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").notStartsWith("id"))).size(1);
    }

    @Test
    void checkAwaitNotStartWithRegex() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").notStartsWith(MatcherConstructor.regex("id")))).size(1);
    }

    @Test
    void checkAwaitEndsWithRegex() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").endsWith(MatcherConstructor.regex("2")))).size(1);
    }

    @Test
    void checkAwaitNotEndsWith() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notEndsWith("2"))).id("id");
    }

    @Test
    void checkAwaitNotEndsWithRegex() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notEndsWith(MatcherConstructor.regex("2")))).id("id");
    }

    @Test
    void checkAwaitNotContains() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").notContains("d"))).
                size(EXACTLY_ONE);
    }

    @Test
    void checkAwaitNotContainsRegex() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($(".small", FilterConstructor.with("id").notContains(MatcherConstructor.regex("d")))).
                size(EXACTLY_ONE);
    }

    @Test
    void checkAwaitEquals() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notContains("d"))).size().
                equalTo(EXACTLY_ONE);
    }

    @Test
    void checkAwaitNotEquals() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notContains("d"))).size().not().
                equalTo(INVALID_EQUALS_NUMBER);
    }

    @Test
    void checkAwaitLessThan() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notContains("d"))).size().
                lessThan(LESS_THAN_FOUR);
    }

    @Test
    void checkAwaitLessThanOrEquals() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notContains("d"))).size().
                lessThanOrEqualTo(LESS_THAN_OR_EQ_1);
    }

    @Test
    void checkAwaitGreaterThan() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notContains("d"))).size().
                greaterThan(GREATER_THAN_MINUS_ONE);
    }

    @Test
    void checkAwaitGreaterThanOrEquals() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($(".small", FilterConstructor.with("id").notContains("d"))).size().
                greaterThanOrEqualTo(1);
    }

    @Test
    void checkWithValue() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($("input", FilterConstructor.with("value").equalTo("John"))).size(JOHN_FOUR_MATCHED);
    }

    @Test
    void checkMultipleFilter() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                .untilEach($(".small", FilterConstructor.with("id").startsWith(MatcherConstructor.regex("id")), FilterConstructor.with("text").endsWith("2")))
                .size(ONLY_ONE_ENDS_WITH_TWO);
    }

    @Test
    void checkHasAttribute() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("input")).attribute("value", "John");
    }

    @Test
    void checkHasAttributeWithOthersFilters() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("input", FilterConstructor.with("value").equalTo("John"))).attribute("value", "John");
    }

    @Test
    void whenElementIsPresentThenAreDisplayedReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($("#default")).displayed();
    }

    @Test
    void whenElementIsPresentThenIsDisplayedReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#default")).displayed();
    }

    @Test
    void whenElementIsNotDisplayedThenAreDisplayedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                            .untilEach($("#unvisible")).displayed();
                });
    }

    @Test
    void whenElementIsNotDisplayedThenIsDisplayedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#unvisible")).displayed();
                });
    }

    @Test
    void whenElementIsNotPresentThenAreNotDisplayedReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#nonexistent")).not().displayed();
    }

    @Test
    void whenElementIsNotPresentThenAreDisplayedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                            .untilEach($("#nonexistent")).displayed();
                });
    }

    @Test
    void whenElementIsNotPresentThenAreEnabledThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                            .untilEach($("#nonexistent")).enabled();
                });
    }

    @Test
    void whenElementIsNotDisplayedThenAreNotDisplayedReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($("#unvisible")).not().displayed();
    }

    @Test
    void whenElementIsNotDisplayedThenIsNotDisplayedReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#unvisible")).not().displayed();
    }

    @Test
    void whenElementIsDisplayedThenAreNotDisplayedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($("#default"))
                            .not().displayed();
                });
    }

    @Test
    void whenElementIsDisplayedThenIsNotDisplayedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                            .untilEach($("#default")).not().displayed();
                });
    }

    @Test
    void whenElementIsEnabledThenAreEnabledReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).untilEach($("#default")).enabled();
    }

    @Test
    void whenElementIsEnabledThenIsEnabledReturnTrue() {
        goTo(JAVASCRIPT_URL);
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#default")).enabled();
    }

    @Test
    void whenElementIsNotEnabledThenAreEnabledThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                            .untilEach($("#disabled")).enabled();
                });
    }

    @Test
    void whenElementIsNotEnabledThenIsEnabledThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#disabled")).enabled();

                });
    }

    @Test
    void whenElementIsSelectedThenIsSelectedReturnTrue() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#selected")).selected();
    }

    @Test
    void whenElementIsNotSelectedThenIsNotSelectedReturnTrue() {
        await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#non_selected")).not().selected();
    }

    @Test
    void whenElementIsNotSelectedThenAreSelectedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> await().atMost(MINIMAL_TIMEOUT, NANOSECONDS)
                        .untilEach($("#non_selected")).selected());
    }

    @Test
    void whenElementIsNotSelectedThenIsSelectedThrowsException() {
        assertThrows(TimeoutException.class,
                () -> {
                    await().atMost(MINIMAL_TIMEOUT, NANOSECONDS).until($("#non_selected"))
                            .selected();
                });
    }

    @Test
    void checkPolling() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().pollingEvery(SECOND_AND_A_HALF_TIMEOUT, TimeUnit.MILLISECONDS)
                            .until($("#default")).text().equalTo("wait");
                });
    }

    @Test
    void checkIsAt() {
        goTo(JAVASCRIPT_URL);
        await().pollingEvery(SECOND_TIMEOUT, TimeUnit.MILLISECONDS).untilPage(new FluentPage()).isAt();
    }

    @Test
    void checkIsAtWithNullPage() {
        assertThrows(IllegalArgumentException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().pollingEvery(SECOND_TIMEOUT, TimeUnit.MILLISECONDS).untilPage().isAt();
                });
    }

    @Test
    void checkLoaded() {
        goTo(JAVASCRIPT_URL);
        await().pollingEvery(SECOND_TIMEOUT, TimeUnit.MILLISECONDS).untilPage().isLoaded();
    }

    @Test
    void checkPredicate() {
        goTo(JAVASCRIPT_URL);
        await().pollingEvery(LESS_THAN_SECOND_TIMEOUT, TimeUnit.MILLISECONDS).untilPredicate(predicate -> true);
    }

    @Test
    void checkPredicateFail() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(SECOND_TIMEOUT).untilPredicate(input -> false);
                });
    }

    @Test
    void checkFunction() {
        goTo(JAVASCRIPT_URL);
        await().pollingEvery(SECOND_TIMEOUT, TimeUnit.MILLISECONDS).until(fluent -> true);
    }

    @Test
    void checkFunctionFail() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(SECOND_TIMEOUT).until(fluent -> false);
                });
    }

    @Test
    void checkSupplier() {
        goTo(JAVASCRIPT_URL);
        await().pollingEvery(SECOND_TIMEOUT, TimeUnit.MILLISECONDS).until(() -> true);
    }

    @Test
    void checkSupplierFail() {
        assertThrows(TimeoutException.class,
                () -> {
                    goTo(JAVASCRIPT_URL);
                    await().atMost(SECOND_TIMEOUT).until(() -> false);
                });
    }

    @Test
    void seleniumWaitIsAvailable() {
        FluentWait wait = await().getWait();
        assertThat(wait).isInstanceOf(FluentWait.class);
    }

    private static class MyFluentPage extends FluentPage {
        @Override
        public void isAt() {
            assertThat(find("#newField").texts()).contains("new");
        }

        @Override
        public String getUrl() {
            return IntegrationFluentTest.JAVASCRIPT_URL;
        }
    }

}