The framework is configured with Screenplay dependencies, allowing you to implement the pattern as tests evolve:
package org.btg.practual.stepDefinitions;import io.cucumber.java.es.Dado;import io.cucumber.java.es.Cuando;import io.cucumber.java.es.Entonces;public class GeneracionReporteSteps { @Dado("el usuario ingresa a la web de Chronos") public void el_usuario_ingresa_a_la_web_de_chronos() { System.out.println("Step: el usuario ingresa a la web de Chronos"); } // Additional step definitions...}
The current step definitions provide a foundation. As the project grows, refactor these into Screenplay Tasks and Interactions for better maintainability.
@Dado("el usuario ingresa a la web de Chronos")public void el_usuario_ingresa_a_la_web_de_chronos() { System.out.println("Step: el usuario ingresa a la web de Chronos");}
import net.serenitybdd.screenplay.Actor;import net.serenitybdd.screenplay.abilities.BrowseTheWeb;import net.thucydides.core.annotations.Managed;import org.openqa.selenium.WebDriver;public class GeneracionReporteSteps { @Managed(driver = "chrome") private WebDriver driver; private Actor usuario; @Before public void setTheStage() { usuario = Actor.named("Usuario de Chronos") .whoCan(BrowseTheWeb.with(driver)); } @Dado("el usuario ingresa a la web de Chronos") public void el_usuario_ingresa_a_la_web_de_chronos() { usuario.attemptsTo( NavigateToChronos.web() ); } @Cuando("ingrese los datos del reporte {string} para la compañia {string} segun la fecha {string}") public void ingrese_los_datos_del_reporte(String reporte, String compania, String fecha) { usuario.attemptsTo( GenerateReport.withDetails(reporte, compania, fecha) ); } @Entonces("se genera el reporte {string} de manera exitosa") public void se_genera_el_reporte_exitosamente(String reporte) { usuario.should( seeThat(ReportGenerationStatus.isSuccessful(), is(true)), seeThat(TheReportName.displayed(), equalTo(reporte)) ); }}
Screenplay works well with Page Objects using the Target concept:
import net.serenitybdd.screenplay.targets.Target;public class ChronosHomePage { public static final Target REPORT_TYPE_DROPDOWN = Target.the("report type dropdown") .locatedBy("#report-type"); public static final Target COMPANY_FIELD = Target.the("company field") .locatedBy("input[name='company']"); public static final Target DATE_PICKER = Target.the("date picker") .locatedBy("#report-date"); public static final Target GENERATE_BUTTON = Target.the("generate report button") .locatedBy("button.generate");}
Target provides descriptive element locators that appear in Serenity reports, making it clear which elements were interacted with.
// Good - reusable Questionactor.should(seeThat(TheReportStatus.value(), equalTo("Success")));// Avoid - direct WebDriver calls in step definitionsString status = driver.findElement(By.id("status")).getText();assertEquals("Success", status);