Aller au contenu

Entrées humanisées

Avec humanize, le SDK exécute les déplacements de souris, les clics, le défilement et la frappe selon des trajectoires et un rythme proches de ceux d'une personne. showCursor dessine le pointeur pour que vous puissiez le suivre.

Entrées humanisées (humanize & showCursor)

Passez humanize et toutes les entrées — déplacements, clics, glisser-déposer, défilement et frappe — suivent un même standard humanisé, aussi bien au niveau de la page (page.click / hover / type / fill / mouse.* / keyboard.type) qu’au niveau des locators (locator.click / type / fill / pressSequentially / dragTo / …). Les déplacements suivent une courbe de Bézier cubique légèrement incurvée, construite à partir de la dernière position du curseur et parcourue comme une somme de sous-mouvements à jerk minimal (un mouvement balistique principal + un mouvement correctif — la vitesse à plusieurs pics d’un vrai geste de pointage, et non une seule cloche symétrique), et tout est envoyé sous forme d’événements réels et de confiance (isTrusted === true, et navigator.webdriver reste à false). Sur Pro, les clics par coordonnées (mouse.click(x, y)) suivent des mouvements enregistrés sur de vraies personnes ; tout le reste, ainsi que chaque clic sur le build ouvert et sur l’offre Gratuit avec GitHub, utilise des trajectoires générées. Ajoutez showCursor pour dessiner un point qui suit le mouvement et le voir à l’œuvre.

Comme les déplacements passent par des entrées natives, un bouton enfoncé avec mouse.down() reste maintenu pendant le déplacement — down → move → up donne donc un vrai glisser avec bouton maintenu (les contrôles qu’on positionne en glissant, comme les sliders, reçoivent un glisser réellement appuyé), et locator.dragTo est lui aussi humanisé. La frappe se fait touche par touche, avec un délai aléatoire entre les touches + des pauses entre les mots et, de temps en temps, une faute de frappe corrigée ; le défilement utilise une inertie ease-out avec, de temps en temps, une pause de lecture. fill donne le focus au champ et tape la valeur (au-delà d’environ 200 caractères, les valeurs restent atomiques pour que les remplissages en masse ne s’éternisent pas).

from clearcote import launch

browser = launch(fingerprint="seed-123", humanize=True, show_cursor=True)
page = browser.new_page()
page.goto("https://example.com")

page.click("text=Sign in")               # eased curve, then a trusted click
page.fill("#email", "you@example.com")   # focus + key-by-key human typing
page.locator("#password").type("s3cr3t") # locators are humanized too

# held-button drag (e.g. a slider): the press stays held across the move
x0, y0, x1 = 100, 300, 400               # the handle's start, and where to release it
page.mouse.move(x0, y0); page.mouse.down()
page.mouse.move(x1, y0); page.mouse.up()
browser.close()