package org.fluentlenium.integration;
import org.fluentlenium.core.FluentControl;
import org.fluentlenium.core.FluentPage;
import org.fluentlenium.core.annotation.Page;
import org.fluentlenium.core.components.ComponentInstantiator;
import org.fluentlenium.core.domain.FluentWebElement;
import org.fluentlenium.core.hook.wait.Wait;
import org.fluentlenium.core.inject.Parent;
import org.fluentlenium.integration.localtest.IntegrationFluentTest;
import org.junit.Test;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@Wait
public class ComponentsTest extends IntegrationFluentTest {
@FindBy(css = ".header")
private Header header;
private Content content;
@FindBy(css = ".footer")
private Footer footer;
@Test
public void testComponents() {
goTo(COMPONENTS_URL);
assertThat(header.loaded()).isFalse();
assertThat(content.loaded()).isFalse();
assertThat(footer.loaded()).isFalse();
assertThat(header.present()).isTrue();
assertThat(content.present()).isTrue();
assertThat(footer.present()).isTrue();
assertThat(header.loaded()).isTrue();
assertThat(content.loaded()).isTrue();
assertThat(footer.loaded()).isTrue();
assertThat(header.title.text()).isEqualTo("Header Title");
assertThat(footer.copyright.text()).isEqualTo("(c) FluentLenium");
assertThat(content.page.pageContent.text()).isEqualTo("Page Content");
assertThat(content.components).hasSize(2);
assertThat(content.page.parent).isSameAs(content);
int i = 1;
for (Component component : content.components) {
assertThat(component.parent).isSameAs(content);
assertThat(component.title.text()).isEqualTo("Component " + i);
assertThat(component.subComponent).isNotNull();
assertThat(component.subComponent.action.text()).isEqualTo("Sub Component " + i + " (" + 1 + ")");
assertThat(component.subComponents).hasSize(3);
int j = 1;
for (SubComponent subComponent : component.subComponents) {
assertThat(subComponent.parent).isSameAs(component);
assertThat(subComponent.action.text()).isEqualTo("Sub Component " + i + " (" + j + ")");
j++;
}
i++;
}
assertThat(content.notPresent.present()).isFalse();
}
public static class Header extends FluentWebElement {
@FindBy(css = ".title")
private FluentWebElement title;
public Header(WebElement webElement, FluentControl fluentControl, ComponentInstantiator instantiator) {
super(webElement, fluentControl, instantiator);
}
}
public static class Footer extends FluentWebElement {
@FindBy(css = ".copyright")
private FluentWebElement copyright;
public Footer(WebElement webElement, FluentControl fluentControl, ComponentInstantiator instantiator) {
super(webElement, fluentControl, instantiator);
}
}
@FindBy(css = ".component")
public static class Component extends FluentWebElement {
@Parent
private Content parent;
@FindBy(css = ".title")
private FluentWebElement title;
@FindBy(css = ".sub-component")
private List<SubComponent> subComponents;
@FindBy(css = ".sub-component")
private SubComponent subComponent;
public Component(WebElement webElement, FluentControl fluentControl, ComponentInstantiator instantiator) {
super(webElement, fluentControl, instantiator);
}
}
public static class SubComponent {
private final WebElement webElement;
@Parent
private Component parent;
@FindBy(css = "a.action")
private FluentWebElement action;
public SubComponent(WebElement webElement) {
this.webElement = webElement;
}
}
public static class ComponentsPage extends FluentPage {
@FindBy(css = ".page > .page-content")
private FluentWebElement pageContent;
@Parent
private Content parent;
}
@FindBy(css = ".content")
public static class Content extends FluentWebElement {
@Page
private ComponentsPage page;
private List<Component> components;
private FluentWebElement notPresent;
public Content(WebElement webElement, FluentControl fluentControl, ComponentInstantiator instantiator) {
super(webElement, fluentControl, instantiator);
}
}
}