¿Cómo creo una prueba 'Web'?
Marcar una prueba como "web"
Importa WebDriverConfig.class en tu configuración del marco de pruebas y proporciona los siguientes beans:
* una lista de WebPageDefinition`s que se usan para vincular los `MessageType`s asociados con una página a una URL relativa y un nombre de página
* una implementación de `BaseWebSteps que satisfaga tu caso de uso
Usa la anotación @web enabled en los metadatos de tu archivo .story para crear un contexto de web driver. Esto abrirá una ventana del navegador para que tu historia se ejecute asignando una instancia de web driver del pool de drivers disponibles. El tamaño del pool se define por la propiedad web-driver.pool.size y su valor predeterminado es 4.
Escribiendo pruebas
De manera similar a otros transportes del marco de pruebas, las acciones principales se han dividido en pasos genéricos para habilitar la acción de insertar, verificar o recuperar elementos de la pantalla.
Paso de navegación y definición de página web
La UI contiene varias páginas a las que se puede navegar utilizando URLs web o mosaicos en la pantalla de inicio. Para hacer el paso de navegación más legible para humanos, se debe crear un WebPageDefinition.java con un MessageType asociado.
Esto permitirá que el paso se lea como:
When the user navigates to the Recall responses needing approval page on the GUI
En lugar de
When the user navigates to the /#/recalls-needing-response page on the GUI
Hacer clic en un elemento y predicados
Fish for element (y fish for element with action) siguen el mismo patrón que pescar messages. Se pasan un conjunto de predicados para filtrar la lista de elementos recuperados. Luego se debe pasar un consumer para realizar una aserción o procesar el resultado
public void fishForElement(String cssSelector, List<Predicate<WebElement>> discriminators, Consumer<WebElement> action) {
List<WebElement> allElementsMatchingSelector = findElementsByCss(cssSelector);
assertFalse("No element matching supplied selector: " + cssSelector, allElementsMatchingSelector.isEmpty());
Optional<WebElement> result = allElementsMatchingSelector.stream()
.filter(Predicates.and(discriminators))
.findFirst();
assertTrue("No element matching supplied predicates", result.isPresent());
LOGGER.debug("Found a matching element on the page");
action.accept(result.get());
}
La primera recuperación desde la pantalla se realiza basada en un selector CSS Esto obtendrá un conjunto de elementos web que se pueden filtrar aún más coincidiendo cualquiera de los atributos de los elementos.
Paso de ejemplo:
And the user clicks on mat-panel-description with attribute values:
|innerHTML|Respond with Resolution|
La única acción pasada actualmente es la función click, pero esto se puede generalizar.
Recuperar elementos de la pantalla
Para realizar aserciones en pantalla basadas en su HTML, usa el siguiente paso
Then the user is able to find the following items on the screen with values:
|.mat-column-recordType |BB_Resolution |
|.mat-column-transactionId |#CAMT_029.RsltnOfInvstgtn.CxlDtls.TxInfAndSts.CxlStsId|
|.mat-column-transactionStatus|ACCEPTED |
Esto encontrará los elementos por el selector dado e iterará por los resultados para coincidir el valor proporcionado
Introducir datos en elementos de formulario o input
Para introducir datos en campos en pantalla usa:
1 - Este paso para introducir datos para un solo elemento
When the user populates the $selector input with value $value
2- Este paso para completar múltiples valores a la vez si el orden de entrada no es relevante
And the user populates the inputs with values:
|$selector1|value1|
|$selector2|value2|
Extensibilidad
Si deseas crear tus propios pasos o páginas personalizados, crea lo siguiente
Una Page que extienda BaseWebPage.java. Esto debe pasarse a tu clase Steps que extienda BaseWebSteps
Para registrar estos en el marco de pruebas, añádelos como una lista bean a tu configuración de pruebas:
Page
@Bean
public List<WebPageDefinition> webPageDefinitions() {
return asList(
webPageDefinition(RECALL_NEEDING_RESPONSE, "recalls-notrespondedto"),
webPageDefinition(TRANSACTION_SEARCH, "transactions/action/search"),
webPageDefinition(TRANSACTION_DETAILS, "transactions")
);
}
private WebPageDefinition webPageDefinition(MessageType webPageType, String relativePath) {
return new WebPageDefinition.WebPageDefinitionBuilder()
.withMessageType(webPageType)
.withRelativePath(relativePath)
.build();
}
Define tus Steps como un Bean así
@Bean
public CommonWebSteps commonWebSteps(List<WebPageDefinition> webPageDefinitions, GenericObjectPool<WebDriver> webDriverPool) {
return new CommonWebSteps(webPageDefinitions, webDriverPool, dashboardUrl);
}