Dinoer

L'élément est là, et le clic ne fait rien

Le sélecteur trouve le bouton, le clic annonce un succès, et rien ne bouge. Trois niveaux, dans l'ordre où les essayer.

Le symptôme. Le sélecteur trouve un élément réel et visible. Vous cliquez, vous obtenez succes: true, et la page ne bouge pas. Ou bien vous obtenez un délai dépassé sur un élément dont --a11y montre qu’il est là.

Pourquoi un élément réel peut être refusé

Playwright refuse de cliquer sur ce qu’une personne ne pourrait pas cliquer. Avant d’agir, il vérifie que l’élément est visible, stable, et qu’aucun autre ne le recouvre. Cette vérification vous évite de cliquer sur un voile de chargement en croyant avoir atteint le bouton derrière.

Elle refuse aussi des éléments qu’une personne peut cliquer : un interrupteur dessiné en CSS, un bouton dans un <dialog> ouvert par showModal(), un élément sous une couche décorative. Tous réels, tous utilisables, tous refusés.

Trois niveaux, dans cet ordre

1. Le clic simple. Commencez toujours par là. S’il fonctionne, le reste ne compte pas.

{"type": "cliquer", "selecteur": "#confirm"}

2. force: true. Saute les vérifications de Playwright et clique quand même : la bonne réponse pour un élément bien présent qui échoue aux vérifications.

{"type": "cliquer", "selecteur": "#confirm", "force": true}

3. repli_js: true. Dinoer fait d’abord le clic natif (avec force s’il est indiqué) ; c’est seulement si Playwright lève une erreur qu’il clique sur l’élément en JavaScript (el.click()), comme vous le feriez à la main dans une action evaluer.

{"type": "cliquer", "selecteur": "#dialog-confirm button[type=submit]",
 "force": true, "repli_js": true}

Indiquer l’option ne transforme pas chaque clic en clic JavaScript : le repli ne s’exécute qu’après un véritable échec.

Savoir quel niveau a fait le travail

La réponse l’indique, seulement quand le repli s’est réellement exécuté :

"boussole": {"repli_js_utilise": true}

Vous savez ainsi si votre cible a vraiment besoin du niveau 3 avant de recopier l’option sur toutes les actions du scénario.

Une incompatibilité, signalée d’emblée repli_js exécute du JavaScript, que –no-evaluer interdit pour toute l’exécution. Un appel qui combine les deux est refusé avec arguments_incompatibles (code de sortie 2) avant le démarrage du navigateur.

Le cas qui se ressemble et n’est pas le même

Si le clic échoue sur un élément situé dans une boîte de dialogue ouverte lors d’un appel précédent, aucun niveau ne vous aidera. La boîte a disparu : reprendre une session recharge la page, et une boîte ouverte par showModal() ne survit pas à un rechargement.

C’est un autre problème, avec une autre solution. La session ne survit pas entre deux appels →

En bref

  • Essayez le clic simple, puis force: true, puis repli_js: true, dans cet ordre.
  • repli_js a besoin d’un véritable échec pour s’exécuter ; ce n’est pas un clic JavaScript à la demande.
  • Lisez repli_js_utilise pour savoir ce dont votre cible a réellement besoin.
  • Un clic qui échoue sur un élément issu d’un appel précédent est un problème de session, pas de clic.