人間らしい入力
humanize を指定すると、SDK がマウスの移動、クリック、スクロール、タイピングを人間らしい軌跡とタイミングで実行します。showCursorはポインターを描画するので、動きを目で確認できます。
人間らしい入力(humanize と showCursor)
humanize を渡すと、移動、クリック、ドラッグ、スクロール、タイピングといったすべての入力が、ページレベル(page.click / hover / type / fill / mouse.* / keyboard.type)でもロケーターレベル(locator.click / type / fill / pressSequentially / dragTo / …)でも、統一された人間らしい動作で実行されます。移動は、直前のカーソル位置から組み立てた、わずかに弧を描く 3 次ベジェ曲線に沿って進みます。その進み方は min-jerk のサブムーブメント合成です(弾道的な主運動 + 修正運動。左右対称なベル型 1 つではなく、実際に手を伸ばす動作に見られる複数ピークの速度プロファイルです)。すべての入力は本物の、信頼された(trusted)イベントとしてディスパッチされます(isTrusted === true で、navigator.webdriver も false のままです)。Pro では、座標指定のクリック(mouse.click(x, y))は実際の人間から記録した動きに従います。それ以外の操作、およびオープンビルドと「GitHub で無料」でのすべてのクリックは、生成した軌跡を使います。showCursor を追加すると、動きに追従するドットが描画され、動作を目で確認できます。
移動にはネイティブ入力を使うため、mouse.down() で押したボタンは移動中も押されたままです。つまり down → move → up は、ボタンを押したままの本物のドラッグになり(スライダーのように目的の位置までドラッグするコントロールでも、実際に押した状態でドラッグされます)、locator.dragTo も人間らしい動作になります。タイピングは 1 キーずつ行い、キー間隔はランダムで、単語の区切りでは間を置き、ときどき打ち間違いを修正します。スクロールはイーズアウトの慣性を使い、ときどき読むための間を挟みます。fill はフィールドにフォーカスしてから入力します(約 200 文字を超える値は一度にまとめて入力されるので、大量の入力でも遅くなりません)。
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()