You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:18:09