Playwright est un framework d'automatisation puissant pour les navigateurs web qui permet aux développeurs d'écrire des tests robustes et efficaces pour les applications web. L'une des principales caractéristiques de Playwright est sa nature asynchrone, qui lui permet de gérer plusieurs opérations simultanément. Au cœur de ce comportement asynchrone se trouve le mot-clé await
, qui joue un rôle crucial dans la gestion du flux des opérations asynchrones dans les scripts Playwright.
Les bases de la programmation asynchrone
Avant de plonger dans les spécificités de await
dans Playwright, il est essentiel de comprendre les bases de la programmation asynchrone en JavaScript.
Dans la programmation synchrone traditionnelle, les opérations sont exécutées les unes après les autres, chaque opération bloquant l'exécution de la suivante jusqu'à ce qu'elle soit terminée. Cela peut entraîner des problèmes de performances, en particulier lors de tâches chronophages telles que les requêtes réseau ou les opérations de fichiers.
La programmation asynchrone permet d'initier plusieurs opérations sans attendre la fin des précédentes. Cette approche non bloquante améliore les performances et la réactivité, en particulier dans les scénarios impliquant des opérations d'E/S ou des ressources externes.
Qu'est-ce que Playwright ?
Avant de plonger dans await
et son rôle, abordons brièvement ce qu'est Playwright. Playwright est une bibliothèque Node.js open source développée par Microsoft pour l'automatisation des navigateurs web. Il prend en charge Chromium, Firefox et WebKit, ce qui en fait un outil polyvalent pour tester les applications web sur différents navigateurs.
Playwright permet aux développeurs et aux testeurs d'écrire des tests fiables et de haute fidélité. Il est particulièrement connu pour sa capacité à gérer plusieurs onglets, iframes et même à intercepter les requêtes réseau. Mais pour exploiter tout son potentiel, il est essentiel de comprendre la programmation asynchrone et le mot-clé await
.
Promises et Async/Await
JavaScript utilise des Promises pour gérer les opérations asynchrones. Une Promise représente une valeur qui peut ne pas être disponible immédiatement, mais qui sera résolue à un moment donné dans le futur. La syntaxe async/await
, introduite dans ECMAScript 2017, offre un moyen plus lisible et plus gérable de travailler avec les Promises.
- Une fonction
async
renvoie toujours une Promise. - Le mot-clé
await
ne peut être utilisé qu'à l'intérieur d'une fonctionasync
. await
met en pause l'exécution de la fonctionasync
jusqu'à ce que la Promise soit résolue.
Le rôle de await
dans Playwright
Dans Playwright, de nombreuses opérations sont de nature asynchrone. Il s'agit notamment de la navigation vers une page, de l'interaction avec des éléments et de l'attente que des conditions spécifiques soient remplies. Le mot-clé await
est largement utilisé dans les scripts Playwright pour gérer efficacement ces opérations asynchrones.
Voici ce que fait await
dans Playwright :
Met en pause l'exécution : Lorsque await
est utilisé avant une action ou une assertion Playwright, il met en pause l'exécution du script jusqu'à ce que cette action ou cette assertion soit terminée.
Résout les Promises : Il attend que la Promise renvoyée par une méthode Playwright soit résolue, ce qui vous permet de travailler directement avec la valeur résolue.
Assure le bon séquencement : Il aide à maintenir l'ordre correct des opérations, en s'assurant qu'une action est terminée avant de passer à la suivante.
Gère les erreurs : Si la Promise attendue est rejetée, await
lève une exception, ce qui vous permet de capturer et de gérer efficacement les erreurs.
Exemples pratiques de await
dans Playwright
Explorons quelques scénarios courants où await
est utilisé dans les scripts Playwright :
1. Navigation
test('Naviguer vers une page', async ({ page }) => {
await page.goto('https://example.com');
// Le script attend que la page soit chargée avant de continuer
});
Dans cet exemple, await
garantit que la navigation est terminée avant que le test ne continue.
2. Interaction avec les éléments
test('Cliquer sur un bouton', async ({ page }) => {
await page.click('#submit-button');
// Le script attend que l'action de clic soit terminée
});
Ici, await
garantit que l'action de clic est entièrement exécutée avant de passer à la suite.
3. Attente des éléments
test('Attendre que l'élément soit visible', async ({ page }) => {
await page.waitForSelector('#dynamic-content');
// Le script s'arrête jusqu'à ce que l'élément soit visible
});
Dans ce cas, await
met le script en pause jusqu'à ce que l'élément spécifié devienne visible sur la page.
4. Assertions
test('Vérifier le titre de la page', async ({ page }) => {
await expect(page).toHaveTitle('Expected Title');
// L'assertion est évaluée de manière asynchrone
});
await
est utilisé avec les assertions pour s'assurer qu'elles sont évaluées correctement, en attendant que la condition soit remplie ou en expirant si ce n'est pas le cas.
L'importance de await
dans Playwright
L'utilisation correcte de await
dans Playwright est cruciale pour plusieurs raisons :
Synchronisation : Il aide à synchroniser les opérations asynchrones, en évitant les conditions de concurrence et en garantissant que les actions sont effectuées dans l'ordre prévu.
Fiabilité : En attendant que les opérations soient terminées, await
rend les tests plus fiables et moins sujets aux problèmes.
Gestion des erreurs : Il permet une bonne propagation des erreurs, ce qui facilite l'identification et le débogage des problèmes dans vos tests.
Lisibilité : await
rend le code asynchrone plus lisible et plus facile à comprendre, car il vous permet d'écrire du code asynchrone d'une manière plus linéaire et synchrone.
Pièges courants et meilleures pratiques
Bien que await
soit puissant, il existe des pièges courants à éviter et des bonnes pratiques à suivre :
1. Oublier d'utiliser await
L'une des erreurs les plus courantes consiste à oublier d'utiliser await
avant une opération asynchrone. Cela peut entraîner un comportement inattendu et des conditions de concurrence.
Incorrect :
test('Utilisation incorrecte', async ({ page }) => {
page.click('#button'); // Ceci est incorrect
expect(page.locator('#result')).toBeVisible();
});
Correct :
test('Utilisation correcte', async ({ page }) => {
await page.click('#button');
await expect(page.locator('#result')).toBeVisible();
});
2. Utilisation excessive de await
Bien qu'il soit important d'utiliser await
pour les opérations asynchrones, une utilisation excessive peut entraîner une exécution séquentielle inutile, ce qui réduit les avantages de la programmation asynchrone.
Moins efficace :
test('Exécution séquentielle', async ({ page }) => {
await page.fill('#field1', 'value1');
await page.fill('#field2', 'value2');
await page.fill('#field3', 'value3');
});
Plus efficace :
test('Exécution parallèle', async ({ page }) => {
const [field1, field2, field3] = await Promise.all([
page.fill('#field1', 'value1'),
page.fill('#field2', 'value2'),
page.fill('#field3', 'value3')
]);
});
3. Utilisation de await
en dehors des fonctions Async
N'oubliez pas que await
ne peut être utilisé qu'à l'intérieur des fonctions async
. L'utiliser à l'extérieur entraînera une erreur de syntaxe.
Incorrect :
test('Utilisation incorrecte', ({ page }) => {
await page.goto('https://example.com'); // Cela provoquera une erreur
});
Correct :
test('Utilisation correcte', async ({ page }) => {
await page.goto('https://example.com');
});
4. Gestion des erreurs
Utilisez toujours des blocs try-catch ou des méthodes .catch()
pour gérer les erreurs potentielles lors de l'utilisation de await
.
test('Gestion des erreurs', async ({ page }) => {
try {
await page.click('#non-existent-button');
} catch (error) {
console.error('Une erreur s\'est produite :', error);
}
});
Utilisation avancée de await
dans Playwright
Au fur et à mesure que vous maîtriserez Playwright, vous rencontrerez des scénarios plus avancés où await
joue un rôle crucial :
1. Assertions personnalisées
Lors de la création d'assertions personnalisées, vous devrez peut-être utiliser await
pour gérer les opérations asynchrones dans la logique d'assertion.
expect.extend({
async toHaveCorrectApiResponse(page, expectedResponse) {
const response = await page.evaluate(() => fetchApiData());
return {
pass: JSON.stringify(response) === JSON.stringify(expectedResponse),
message: () => `Expected API response to match ${expectedResponse}`
};
}
});
test('Assertion personnalisée', async ({ page }) => {
await expect(page).toHaveCorrectApiResponse({ status: 'success' });
});
2. Gestion de plusieurs Promises
Dans des scénarios complexes, vous devrez peut-être gérer plusieurs promises simultanément. La méthode Promise.all()
, combinée à await
, est utile dans de tels cas.
test('Gérer plusieurs promises', async ({ page }) => {
const [navigationPromise, dialogPromise] = await Promise.all([
page.waitForNavigation(),
page.waitForEvent('dialog'),
page.click('#submit-button')
]);
await dialogPromise.accept();
await navigationPromise;
});
3. Attente conditionnelle
Parfois, vous devrez peut-être attendre une condition qui peut ou non se produire. Vous pouvez utiliser try-catch
avec un délai d'attente pour gérer de tels scénarios.
test('Attente conditionnelle', async ({ page }) => {
try {
await page.waitForSelector('#popup', { timeout: 5000 });
await page.click('#close-popup');
} catch (error) {
// La fenêtre contextuelle n'est pas apparue, continuez avec le test
}
});
Intégration de Playwright avec Apidog
L'intégration de Playwright avec Apidog peut faire passer vos tests au niveau supérieur. Apidog fournit des outils robustes de conception, de documentation et de test d'API qui peuvent compléter vos tests Playwright, garantissant que votre application web fonctionne correctement à la fois sur le frontend et le backend.
Envoi de votre API avec Apidog
Maintenant que vous avez une API fonctionnelle et un frontend React, il est temps de tester votre API. Apidog est un outil fantastique pour cela.
Étape 1 : Ouvrez Apidog et créez une nouvelle requête.

Étape 2 : Dans l'éditeur de test, entrez l'URL de votre point de terminaison d'API, sélectionnez la méthode HTTP et ajoutez tous les en-têtes, paramètres ou données de corps dont vous avez besoin. Par exemple, vous pouvez tester la route qui renvoie un message simple que nous avons créé précédemment :

Étape 3 : Cliquez sur le bouton Envoyer et voyez le résultat de votre test. Vous devriez voir le code d'état, le temps de réponse et le corps de la réponse de votre API. Par exemple, vous devriez voir quelque chose comme ceci :

Apidog est un excellent outil pour tester vos API, car il vous aide à garantir la qualité, la fiabilité et les performances de vos services web. Il vous fait également gagner du temps et des efforts, car vous n'avez pas besoin d'écrire de code ou d'installer de logiciel pour tester vos API. Vous pouvez simplement utiliser votre navigateur et profiter de l'interface et des fonctionnalités conviviales d'Apidog.
Conclusion
Comprendre ce que fait await
dans Playwright est crucial pour écrire des tests efficaces et fiables. En tirant parti d'async/await, vous pouvez vous assurer que chaque étape de votre script de test s'exécute dans le bon ordre, en évitant les problèmes potentiels et en améliorant la maintenabilité de vos tests.
N'oubliez pas de télécharger Apidog gratuitement pour améliorer davantage votre boîte à outils de test. Avec Playwright et Apidog combinés, vous disposerez d'une solution complète pour les tests frontend et backend.