1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
async def click_element(cdp: CDPClient, selector: str):
"""点击指定元素"""
element = await get_element(cdp, selector)
box = await get_element_box(cdp, element['nodeId'])
x, y = box['center']
# 模拟鼠标点击(mousedown → mouseup)
await cdp.send_command("Input.dispatchMouseEvent", {
"type": "mousePressed",
"x": x,
"y": y,
"button": "left",
"clickCount": 1
})
await cdp.send_command("Input.dispatchMouseEvent", {
"type": "mouseReleased",
"x": x,
"y": y,
"button": "left",
"clickCount": 1
})
async def type_text(cdp: CDPClient, selector: str, text: str):
"""在输入框中输入文本"""
# 先点击输入框获取焦点
await click_element(cdp, selector)
await asyncio.sleep(0.1)
# 清空现有内容
await cdp.send_command("Runtime.evaluate", {
"expression": f"""
(function() {{
const el = document.querySelector('{selector}');
el.value = '';
el.dispatchEvent(new Event('input', {{bubbles: true}}));
}})()
"""
})
# 逐字符输入
for char in text:
await cdp.send_command("Input.dispatchKeyEvent", {
"type": "keyDown",
"text": char,
"key": char,
"unmodifiedText": char
})
await cdp.send_command("Input.dispatchKeyEvent", {
"type": "keyUp",
"key": char
})
await asyncio.sleep(0.02) # 模拟人类输入速度
async def scroll_to_element(cdp: CDPClient, selector: str):
"""滚动到指定元素可见"""
await cdp.send_command("Runtime.evaluate", {
"expression": f"""
document.querySelector('{selector}')
.scrollIntoView({{behavior: 'smooth', block: 'center'}})
"""
})
await asyncio.sleep(0.5) # 等待滚动完成
|