es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Guion de Serenity: usa el contexto de búsqueda dentro del localizador de destino.

Estoy utilizando Serenity para pruebas de automatización. Anteriormente utilicé WebDriver básico y el patrón PageObject.
Pensé en cambiar a Serenity por la gran disponibilidad de API y el patrón Screenplay.
Encontré un problema al utilizar el patrón Screenplay:
1. Utilizo la clase Target para localizar el elemento.
2. Utilizo la siguiente línea para asegurarme de que un elemento dado sea visible:

actor.attemptsTo(Ensure
.that(target)
.isDisplayed());

Pregunta: ¿Hay alguna forma de pasar el PageObject actual o un WebElementFacade al Target, o dónde se utiliza el Target? Me gustaría evitar buscar en todo el DOM. Además, puede haber casos en los que haya varios elementos presentes, por lo que es necesario limitar el área de búsqueda en el DOM.

Logré hacer esto fácilmente con WebDriver y el patrón PageObject. Busqué dentro del WebElement del PageObject. Utilicé PageObjects anidados para definir una página y reutilizar los componentes comunes.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en selenium-webdriver, serenity-bdd, cucumber-serenity, puedo sugerir la siguiente solución para tu problema:

    Para pasar el PageObject actual o un WebElementFacade a la clase Target u cualquier otro lugar donde se utilice, puedes crear una subclase personalizada de Target que tome el WebElementFacade como argumento del constructor. De esta manera, puedes limitar el área de búsqueda en el DOM solo al WebElementFacade pasado, en lugar de buscar en todo el DOM.

    Aquí tienes un ejemplo de implementación:

    public class WebElementFacadeTarget extends Target {
    
        private final WebElementFacade element;
    
        public WebElementFacadeTarget(WebElementFacade element) {
            this.element = element;
        }
    
        @Override
        public List<webelement> resolveAll() {
            return ImmutableList.of(element.getWrappedElement());
        }
    
        @Override
        public String getName() {
            return "WebElementFacadeTarget";
        }
    }
    

    Con esta subclase personalizada de Target, puedes usarlo de la siguiente manera:

    WebElementFacade elementFacade = somePageObject.getElementFacade();
    Target target = new WebElementFacadeTarget(elementFacade);
    actor.attemptsTo(Ensure.that(target).isDisplayed());
    

    De esta manera, puedes reutilizar los componentes comunes y limitar el alcance de tus búsquedas a objetos WebElementFacade específicos, tal como lo hiciste con el patrón WebDriver y PageObject.

Comments are closed.