Python实现Typeracer自动速录问题:文本无法完整输入
解决Typeracer自动打字中途停止的问题
我来帮你排查这个问题,你遇到的中途停止输入的情况,大概率是几个常见的自动化操作问题导致的,咱们一步步来解决:
1. 先删掉重复的输入代码
你现在的代码里先执行了answer_box.send_keys(type_text),紧接着又循环逐个输入每个字符,这会导致重复输入,甚至触发网站的输入限制逻辑,直接把这行重复的代码删掉就好。
2. 替换脆弱的绝对XPath
绝对XPath(比如/html/body/div[1]/...)非常不稳定,只要页面结构有一点点变化就会失效,导致中途找不到元素而停止。建议改用相对XPath或者基于元素属性的定位方式:
- 进入比赛的按钮:用文本内容定位
//a[contains(text(),'Enter a typing race')] - 待输入的文本:用元素属性定位
//div[contains(@class,'mainViewport')]//div[@unselectable='on'] - 输入框:用type和class属性定位
//input[@type='text' and @class='txtInput'] - 倒计时元素:用class属性定位
//span[contains(@class,'countdown')]
3. 用显式等待替代硬sleep
硬编码的time.sleep太死板,如果页面加载慢或者网络波动,很容易出现元素还没加载完成就开始操作的情况。改用Selenium的WebDriverWait显式等待,能确保元素就绪后再执行操作。
4. 规避反作弊机制
Typeracer有反自动化检测,太规律的输入或者Selenium的特征可能会被识别,导致输入被限制。可以给Chrome加参数模拟真实浏览器,同时让输入延迟有一点随机波动。
修改后的完整代码
import time import random from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By class TyperaceBot: def __init__(self): # 配置Chrome选项,规避反检测 options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) # 启动浏览器并打开Typeracer self.driver = webdriver.Chrome(options=options) self.driver.get("https://play.typeracer.com/") # 显式等待进入比赛按钮加载完成并点击 enter_race = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.XPATH, "//a[contains(text(),'Enter a typing race')]")) ) enter_race.click() # 等待待输入文本加载完成并获取内容 type_text = WebDriverWait(self.driver, 15).until( EC.presence_of_element_located((By.XPATH, "//div[contains(@class,'mainViewport')]//div[@unselectable='on']")) ).text print(f"待输入文本:{type_text}") # 等待倒计时结束(或者倒计时元素消失) try: WebDriverWait(self.driver, 10).until( EC.text_to_be_present_in_element((By.XPATH, "//span[contains(@class,'countdown')]"), ":00") ) time.sleep(0.3) # 给一点缓冲时间 except Exception: # 倒计时元素消失,说明可以直接开始输入了 pass # 等待输入框可点击并激活 answer_box = WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//input[@type='text' and @class='txtInput']")) ) answer_box.click() # 逐个输入字符,加入随机延迟模拟真实打字 for letter in type_text: # 每次输入前确保输入框处于激活状态(可选,但更稳妥) answer_box.send_keys(letter) # 随机延迟0.007到0.012秒,模拟自然打字的节奏 delay = random.uniform(0.007, 0.012) time.sleep(delay) my_typing_bot = TyperaceBot()
注意事项
- 确保你的ChromeDriver版本和Chrome浏览器版本匹配,否则可能出现驱动异常
- 如果还是出现输入中断,可以适当增加延迟的最大值,比如把
random.uniform(0.007, 0.012)改成random.uniform(0.01, 0.015),降低输入速度 - 不要频繁运行脚本,避免被Typeracer封禁账号
内容的提问来源于stack exchange,提问作者user14221871
相关产品推荐
相关产品推荐

