Aller au contenu principal
Leçon 6 sur 14 · Computer Use et Automatisation

Remplir des formulaires et cliquer

Leçon 6 sur 14 Mis à jour le 3 novembre 2026 Développeur
Sur cette page
  1. L’interaction la plus courante
  2. Cliquer avant de taper
  3. Vider un champ avant de le remplir
  4. Menus, cases et boutons radio
  5. Les formulaires en plusieurs écrans
  6. Réagir aux erreurs de validation
  7. L’upload, cas à part
  8. Points clés à retenir

Leçon corrigée le 3 novembre 2026 d’après les consignes de confirmation d’OpenAI et la documentation de Playwright : le délai de frappe n’est plus présenté comme un moyen d’échapper aux détections anti-bot ; la sélection utilise ControlOrMeta+a, valable aussi sur macOS ; un page.screenshot() ne montre pas la boîte de dialogue native d’ouverture de fichier, contrairement à ce qu’affirmait l’ancienne version ; les consignes passent par le paramètre instructions. Sources : Confirmation et consentement · Playwright, Keyboard.

L’interaction la plus courante

Si vous ne deviez maîtriser qu’un geste, ce serait celui-là. Soumettre une demande de contact, remplir un devis, saisir une fiche client dans un CRM sans API : le formulaire est le point de passage obligé de la plupart des automatisations. C’est aussi là que les agents mal réglés échouent le plus souvent, pour des raisons très concrètes que cette leçon prend une à une.

Cliquer avant de taper

L’action type n’écrit pas dans un champ, elle écrit dans le champ actuellement focalisé. La nuance ne s’oublie qu’une fois : sans clic préalable, votre texte part dans le vide ou, plus vicieux, s’ajoute au champ précédent. La séquence est donc invariablement un clic pour focaliser, puis la frappe.

# Dans votre exécuteur d'actions
def execute_type(page, text: str):
    """Tape du texte dans le champ focalisé."""
    page.keyboard.type(text, delay=50)

Le delay=50 mérite qu’on s’y arrête. keyboard.type envoie déjà les événements clavier caractère par caractère, mais sans délai il les enchaîne aussi vite que possible ; avec cinquante millisecondes entre deux frappes, le rythme tombe à vingt caractères par seconde. Les champs qui réagissent à chaque frappe — autocomplétion, masque de saisie d’un numéro de téléphone — ont ainsi le temps de suivre. Ce réglage ne sert pas à se faire passer pour un humain : un site qui cherche à bloquer les robots exprime une volonté à respecter (leçon 14).

Vider un champ avant de le remplir

Un formulaire pré-rempli — reprise de session, valeur par défaut, autocomplétion du navigateur — transforme votre saisie en concaténation absurde : « Dupont » tapé derrière « Martin » donne « MartinDupont », et le formulaire est accepté sans la moindre erreur. Sélectionnez tout avant de taper.

def clear_and_type(page, text: str):
    """Sélectionne tout le contenu du champ puis tape."""
    page.keyboard.press("ControlOrMeta+a")  # Ctrl+A, ou Cmd+A sur macOS
    page.keyboard.type(text, delay=50)

Le modèle, lui, décide de ses actions à partir du prompt : rappelez-lui la règle, faute de quoi il tapera directement dans le champ occupé.

task = """
Remplis le formulaire de contact :
- Champ "Nom" : Dupont
- Champ "Email" : [email protected]
- Champ "Message" : Demande de devis pour 50 licences

IMPORTANT : Avant de taper dans chaque champ, 
sélectionne tout le texte existant (Ctrl+A) pour le remplacer.
Après avoir rempli tous les champs, clique sur le bouton Envoyer.
"""

Un menu déroulant <select> demande trois temps : un clic pour l’ouvrir, une attente le temps que les options s’affichent, un second clic sur l’option voulue. La bonne nouvelle, c’est que les menus personnalisés en JavaScript — ceux qui ne sont pas de vrais <select> et donnent tant de mal aux scripts classiques — se traitent exactement de la même manière, puisque l’agent ne voit que le rendu visuel : il clique, découvre les options sur le screenshot suivant, et clique sur la bonne.

Les cases à cocher et les boutons radio paraissent plus simples, un clic suffisant à les activer. Le piège est ailleurs : une case déjà cochée se décoche au clic, et votre agent vient d’annuler le consentement qu’il devait donner. Il doit donc lire l’état avant d’agir, et vous devez le lui demander explicitement. Gardez aussi en tête qu’accepter des conditions ou créer un compte engage la personne pour qui l’agent travaille : ne lui confiez ces gestes que si elle les a explicitement demandés.

task = """
Dans le formulaire d'inscription :
1. Coche la case "J'accepte les conditions" si elle n'est pas cochée
2. Sélectionne "Entreprise" dans le type de compte
3. Clique sur "Créer le compte"

Vérifie l'état de chaque élément AVANT de cliquer.
"""

Les formulaires en plusieurs écrans

Un tunnel d’inscription en trois pages n’est pas trois fois plus difficile qu’un formulaire simple, à condition de structurer la consigne page par page et de marquer les transitions. L’agent sait alors quand une section est terminée et sur quel bouton passer à la suivante. L’exemple manipule des données personnelles fictives ; avec de vraies données, souvenez-vous qu’OpenAI considère la saisie d’une information sensible dans un formulaire comme une transmission, à faire approuver par la personne concernée.

task = """
Remplis le formulaire d'inscription en 3 étapes :

ÉTAPE 1 - Informations personnelles :
- Prénom : Jean
- Nom : Dupont
- Date de naissance : 15/03/1985
→ Clique sur "Suivant"

ÉTAPE 2 - Coordonnées :
- Email : [email protected]
- Téléphone : 06 12 34 56 78
- Adresse : 12 rue de la Paix, 75002 Paris
→ Clique sur "Suivant"

ÉTAPE 3 - Confirmation :
- Vérifie que toutes les informations sont correctes
- Coche "J'accepte les CGU"
→ Clique sur "Valider"
"""

Réagir aux erreurs de validation

Un format de téléphone refusé, un champ obligatoire oublié, un mot de passe jugé trop court : le formulaire renvoie un message et attend une correction. C’est exactement la situation où Computer Use surpasse un script, puisque l’agent sait lire l’erreur affichée au lieu de buter dessus. Encore faut-il lui demander de la chercher, et borner ses tentatives pour qu’un champ définitivement rejeté ne le fasse pas boucler sans fin. Ces règles vont dans le paramètre instructions, renvoyé à chaque requête (leçon 5).

INSTRUCTIONS = """
Après avoir soumis un formulaire :
1. Prends un screenshot pour voir le résultat
2. Si des messages d'erreur apparaissent (en rouge, encadrés), 
   lis-les et corrige les champs concernés
3. Resoumets le formulaire
4. Répète jusqu'à ce que le formulaire soit accepté 
   ou que tu aies essayé 3 fois
"""

L’upload, cas à part

Il existe une limite qu’aucun prompt ne franchira : la boîte de dialogue d’ouverture de fichier appartient au système d’exploitation, pas à la page. L’agent ne la voit même pas — page.screenshot() ne capture que le contenu de la page — et les coordonnées qu’il produit s’appliquent à la page, pas à une fenêtre native. Confiez l’opération à Playwright, qui court-circuite entièrement ce dialogue.

def handle_file_upload(page, file_path: str, selector: str):
    """Upload un fichier via Playwright (pas via Computer Use)."""
    page.locator(selector).set_input_files(file_path)

Vous pouvez aussi laisser l’agent cliquer sur « Parcourir » comme un utilisateur et intercepter le sélecteur de fichiers au moment où il s’ouvre : le workflow reste naturel de bout en bout, la partie système étant traitée en coulisses. Dans les deux cas, c’est votre code qui choisit le fichier, jamais le modèle ; et l’envoi de fichiers fait partie des actions qu’OpenAI autorise à pré-approuver dans la demande initiale, à confirmer sinon.

# L'agent clique sur "Parcourir", puis vous interceptez
page.on("filechooser", lambda fc: fc.set_files("/path/to/file.pdf"))

Points clés à retenir

  • Toujours cliquer sur un champ avant de taper dedans
  • Utilisez Ctrl+A (ControlOrMeta+a dans Playwright) pour vider un champ avant la saisie
  • Les menus déroulants nécessitent un clic pour ouvrir puis un clic pour sélectionner
  • Prévoyez la gestion des erreurs de validation dans le prompt
  • L’upload de fichiers doit être géré par Playwright, pas par Computer Use