# utils/playwright_helpers.py
import random
from typing import Tuple, Optional
from playwright.sync_api import Locator, Page
def type_like_human(
locator: Locator,
text: str,
delay_range: Tuple[int, int] = (50, 180),
mistype_rate: float = 0.0,
mistype_chars: str = "asdfjkl;",
clear_first: bool = True,
) -> None:
"""
在指定 `locator` 上逐字输入 `text`,并随机化按键间隔,模拟真人行为。
Parameters
----------
locator : playwright.sync_api.Locator
输入框的 Locator。
text : str
要输入的文本。
delay_range : Tuple[int, int], default=(50, 180)
每个字符之间等待的随机毫秒范围。
mistype_rate : float, default=0.0
输入过程中随机打错一个字符再退格的概率(0~1 之间)。
mistype_chars : str, default="asdfjkl;"
可能被误打的字符集合。
clear_first : bool, default=True
是否在输入前先清空输入框。
"""
page: Page = locator.page
if clear_first:
locator.fill("") # Ctrl+A Del
low, high = delay_range
if low > high:
raise ValueError("delay_range 必须满足 (min, max),且 min ≤ max")
for ch in text:
locator.type(ch)
# 可能随机“手抖”一下:
if mistype_rate and random.random() < mistype_rate:
wrong = random.choice(mistype_chars)
locator.type(wrong)
page.keyboard.press("Backspace")
pause = random.uniform(low, high)
page.wait_for_timeout(pause)
page: Page = locator.page的意思
page: | 类型注解的开始。告诉阅读代码的人和 IDE —— 这个变量叫 page 。 | |
Page | Playwright 里 页面对象 的类名,位于 playwright.sync_api.Page 。写在冒号后面表示:“page 变量的类型应当是 Page 。”
这对 IDE 自动补全、静态检查(mypy / Pyright)都很有用。 | |
locator.page | 取出 Locator 对象所属的页面。
在 Playwright 中,每个 Locator 内部都持有对它所依附的 Page 实例的引用,属性名就叫 page 。 |