autoUpload/test_typing.py

207 lines
7.7 KiB
Python
Raw Normal View History

import asyncio
import random
from playwright.async_api import async_playwright
from utils.enhanced_human_typing import EnhancedHumanTypingSimulator
from utils.paste_typing import PasteTypingSimulator
async def xhs_tag_input(page, tags: list, selector: str):
"""模拟小红书的标签输入逻辑"""
element = await page.wait_for_selector(selector)
await element.click()
for i, tag in enumerate(tags):
# 输入#号
await page.keyboard.press("Shift")
await asyncio.sleep(random.uniform(0.1, 0.2))
await page.keyboard.press("3")
await page.keyboard.up("Shift")
await asyncio.sleep(random.uniform(0.2, 0.4))
# 输入标签文本
for char in tag:
await page.keyboard.type(char, delay=random.randint(300, 500))
await asyncio.sleep(random.uniform(0.1, 0.2))
# 输入回车并等待
await page.keyboard.press("Enter")
await asyncio.sleep(random.uniform(0.5, 0.8))
# 标签间额外停顿
if i < len(tags) - 1:
await asyncio.sleep(random.uniform(0.8, 1.2))
async def xhs_type_text(page, text: str, selector: str):
"""模拟小红书的文本输入逻辑"""
# 定位元素
element = await page.wait_for_selector(selector)
await element.click()
# 按段落分割
paragraphs = text.split('\n\n')
for i, paragraph in enumerate(paragraphs):
if not paragraph.strip():
continue
# 逐字符输入
for j, char in enumerate(paragraph):
# 特殊字符处理
if char in ',。!?、':
# 中文标点输入稍慢
await page.keyboard.type(char, delay=random.randint(200, 300))
await asyncio.sleep(random.uniform(0.1, 0.2))
elif char in ',.!?':
# 英文标点输入较快
await page.keyboard.type(char, delay=random.randint(150, 250))
await asyncio.sleep(random.uniform(0.08, 0.15))
else:
# 普通字符正常速度
await page.keyboard.type(char, delay=random.randint(100, 200))
await asyncio.sleep(random.uniform(0.05, 0.1))
# 每输入15-25个字符后可能停顿思考
if j > 0 and j % random.randint(15, 25) == 0:
await asyncio.sleep(random.uniform(0.3, 0.8))
# 段落间添加换行和思考时间
if i < len(paragraphs) - 1:
# 段落结束,停顿思考
await asyncio.sleep(random.uniform(0.5, 1.0))
# 输入两个换行
await page.keyboard.press("Enter")
await asyncio.sleep(random.uniform(0.1, 0.2))
await page.keyboard.press("Enter")
# 准备输入下一段
await asyncio.sleep(random.uniform(0.8, 1.5))
async def test_typing():
test_text = """这是一段测试文本,用来展示人类化输入效果。
这是第二段落包含一些标点符号
以及一些英文字符和数字 Hello World 123
最后一段用来测试段落之间的停顿效果
交通指南
7号线直达施园站步行5分钟入园
自驾导航北京环球城市大道停车场直通园区
建议早9点开园前排队热门项目可节省1小时等待
🎢必玩项目清单
🔥哈利波特对角巷买黄油啤酒探索霍格沃茨城堡内部奥秘需提前线上预约
🔥侏罗纪世界大冒险激流勇进必玩恐龙特效超震撼
🔥变形金刚霸天虎过山车速度与激情现场版
🔥小黄人乐园适合带娃拍照旋转扫把项目萌趣满分
🍽美食玄学
好莱坞街区霓虹街市集汉堡配奶昔
功夫熊猫平先生面馆云吞面地道
景区内餐标偏高建议自带水杯续水
"""
async with async_playwright() as playwright:
# 启动浏览器,添加剪贴板权限
browser = await playwright.chromium.launch(headless=False) # 设置为False以便观察
context = await browser.new_context(permissions=['clipboard-read', 'clipboard-write'])
page = await context.new_page()
# 创建一个简单的HTML页面
await page.set_content('''
<!DOCTYPE html>
<html>
<head>
<title>输入测试对比</title>
<style>
body { padding: 20px; font-family: Arial, sans-serif; }
.container {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.input-box {
flex: 1;
}
.textarea {
width: 100%;
height: 300px;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
line-height: 1.5;
margin-top: 10px;
}
h2 { margin-bottom: 5px; }
.description {
color: #666;
margin-bottom: 10px;
font-size: 14px;
}
</style>
</head>
<body>
<h2>正文输入测试</h2>
<div class="container">
<div class="input-box">
<h3>优化版输入</h3>
<div class="description">使用jieba分词的智能输入</div>
<textarea id="enhanced-area" class="textarea" placeholder="优化版输入区域..."></textarea>
</div>
<div class="input-box">
<h3>小红书版输入</h3>
<div class="description">模拟小红书的输入逻辑</div>
<textarea id="xhs-area" class="textarea" placeholder="小红书版输入区域..."></textarea>
</div>
<div class="input-box">
<h3>复制粘贴版输入</h3>
<div class="description">模拟用户复制粘贴行为</div>
<textarea id="paste-area" class="textarea" placeholder="复制粘贴版输入区域..."></textarea>
</div>
</div>
</body>
</html>
''')
# 创建输入模拟器实例
enhanced_typer = EnhancedHumanTypingSimulator(page)
paste_typer = PasteTypingSimulator(page)
# 执行正文输入测试
print("\n=== 开始正文输入测试 ===")
print("1. 开始复制粘贴版输入测试...")
# 找到目标输入框并聚焦
text_area = await page.wait_for_selector("#paste-area")
await text_area.click()
# 使用 keyboard API 直接模拟输入
# 先全选当前内容(如果有的话)
await page.keyboard.press("Control+A")
await asyncio.sleep(random.uniform(0.1, 0.2))
# 输入文本
await page.keyboard.type(test_text)
print("复制粘贴版输入完成!")
await asyncio.sleep(2)
print("\n2. 开始优化版输入测试...")
await enhanced_typer.type_text(test_text, "#enhanced-area")
print("优化版输入完成!")
await asyncio.sleep(2)
print("\n3. 开始小红书版输入测试...")
await xhs_type_text(page, test_text, "#xhs-area")
print("小红书版输入完成!")
await asyncio.sleep(2)
# 关闭浏览器
await browser.close()
if __name__ == "__main__":
asyncio.run(test_typing())