@edugouvfr/ngx-dsfr
Version:
NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).
123 lines (118 loc) • 5.09 kB
JavaScript
import { expect } from '@playwright/test';
class BasePageObjectModel {
constructor(page, componentName, componentType) {
this.page = page;
this.componentName = componentName;
this.componentType = componentType;
this.sbFrame = page.frameLocator('#storybook-preview-iframe');
// par défaut le contexte de localisation est la frame (story preview)
this._locatorContext = this.frame;
}
get frame() {
return this.sbFrame;
}
getByAltText(text, options) {
return this._locatorContext.getByAltText(text, options);
}
getByLabel(text, options) {
return this._locatorContext.getByLabel(text, options);
}
getByPlaceholder(text, options) {
return this._locatorContext.getByPlaceholder(text, options);
}
getByRole(role, options) {
return this._locatorContext.getByRole(role, options);
}
getByTestId(testId) {
return this._locatorContext.getByTestId(testId);
}
getByText(text, options) {
return this._locatorContext.getByText(text, options);
}
getByTitle(text, options) {
return this._locatorContext.getByTitle(text, options);
}
locator(selector, options) {
return this._locatorContext.locator(selector, options);
}
async goToPage(variant = 'default', waitUntil = 'load') {
this._locatorContext = this.frame;
return this.page.goto(`?path=/story/${this.componentType}-${this.componentName}--${variant}`, {
waitUntil: waitUntil,
});
}
/**
* Permet de naviguer vers l'url de la story en mode standalone (hors storybook).
*/
async goToFullScreenPage(variant = 'default', svgName = '') {
this._locatorContext = this.page;
const url = `iframe.html?id=${this.componentType}-${this.componentName}--${variant}`;
await this.doActionAndCheckSvg(this.page.goto(url, { waitUntil: 'load' }), svgName);
}
/**
* Test par comparaison de screenshot. Permet de prévenir les régressions visuelles sur un composant.
*
* @param componentLocator Locator correspondant au composant sujet du screenshot
* @param screenshotName Nom du screenshot (souvent le nom du composant)
* @param options Options possibles de la méthode toHaveScreenshot
*/
async testSnapshot(componentLocator, screenshotName, options) {
if (componentLocator === this.page) {
await expect(this.page.locator('storybook-root')).toBeVisible();
}
else {
await expect(componentLocator).toBeVisible();
}
await expect(componentLocator).toHaveScreenshot(screenshotName + '.png', options);
}
/**
* Permet de vérifier le bon chargement d'un svg via la reponse de sa requête http.
*
* @param name Nom du svg (sans l'extension '.svg'). Vérifie le chargement de n'importe quel svg si non renseigné
* @returns La Requête reçue correspondant au chargement du svg
*/
async waitForSvg(name = '') {
return this.page.waitForResponse((response) => response.url().endsWith(`${name}.svg`));
}
/**
* Test le bon chargement du svg correspondant après avoir effectué une action spécifique afin d'assurer
* la cohérence graphique d'une page en cas de tests screenshot
*
* @param action Promise correspondant à l'action censé déclencher le chargement du nouveau svg
* @param svgName Nom du svg sensé être chargé (sans l'extension '.svg'). Vérifie le chargement de n'importe quel svg si non renseigné
* @returns Une Promise contenant un tableau avec en index 0 le retour de l'action effectuée et en index 1 la reponse
* de la requête d'appel du svg
*/
async doActionAndCheckSvg(action, svgName = '') {
const promises = [action];
if (svgName)
promises.push(this.waitForSvg(svgName));
return Promise.all(promises);
}
/**
* Permet de récupérer des éléments appartenant à l'onglet 'Controls' de Storybook.
*/
sbControlLocator(selector, options) {
return this.page.locator(selector, options);
}
/**
* Actionne la combinaison clavier spécifiée et assure que le focus est positionné sur le bon élément en séquence.
*
* @param tabNavigationSequence Décrit la séquence de navigation attendue.
* @param keyPressContext Fournit le locator pointant vers l'élément qui doit être actionné.
* @param withShift
*/
async expectTabSequence(tabNavigationSequence, keyPressContext, withShift = false) {
const keyToPress = withShift ? 'Shift+Tab' : 'Tab';
for (let navigationStepIndex in tabNavigationSequence) {
await keyPressContext.press(keyToPress);
await expect(tabNavigationSequence[navigationStepIndex]).toBeFocused();
}
}
}
/* Public API Surface of @edugouvfr/ngx-dsfr/sdk */
/**
* Generated bundle index. Do not edit.
*/
export { BasePageObjectModel };
//# sourceMappingURL=edugouvfr-ngx-dsfr-sdk.mjs.map