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

使用Selenium定位kahoot.it页面元素触发TimeoutException该如何解决

问题根因与解决方案

1 核心错误:By.CLASS_NAME不支持多类名定位

By.CLASS_NAME方法仅能接收单个类名作为参数,你传入的sc-bZSQDF bXdUBZ是两个空格分隔的独立类名,Selenium会直接将整段字符串当做单个类名匹配,自然找不到对应元素。

2 次要问题:动态类名不稳定

你使用的sc-开头的类名是前端CSS Modules自动生成的动态类,站点每次版本更新都会变动,用这类类名定位的代码可维护性极低,很容易失效。

3 修复方案

方案A 改用CSS选择器适配多类名(临时可用)

把多类名的定位规则改为CSS选择器格式,多个类名之间用.连接,开头也加.,同时将等待条件改为element_to_be_clickable,比presence_of_element_located更适配输入、点击类操作:

# 原错误写法
# gameid = WebDriverWait(drv,5).until(EC.presence_of_element_located((By.CLASS_NAME , "sc-bZSQDF bXdUBZ")))
# 修改后写法
gameid = WebDriverWait(drv,5).until(EC.element_to_be_clickable((By.CSS_SELECTOR , ".sc-bZSQDF.bXdUBZ")))

方案B 改用固定属性定位(推荐,稳定性高)

直接用输入框的固有属性、按钮的类型做定位,完全不受动态类名影响:

for idr in tabs:
    num+=1
    drv.switch_to.window(idr)
    time.sleep(0.3)
    # 定位游戏PIN输入框,可根据实际页面的placeholder关键词调整
    gameid = WebDriverWait(drv,5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[placeholder*="Game PIN"]')))
    # 定位提交按钮,直接匹配提交类型按钮
    gamebutton = WebDriverWait(drv,5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[type="submit"]')))
    gameid.send_keys(gamepin)
    gamebutton.click()
    time.sleep(0.8)

    try:
        # 定位昵称输入框
        nick = WebDriverWait(drv,5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[placeholder*="Nickname"]')))
        nickbutton = WebDriverWait(drv,5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[type="submit"]')))
        nick.send_keys(f'{name}{num - 1}')
        nickbutton.click()
    except Exception as e:
        print(f"加入失败:{str(e)}")

4 额外排查点

如果修改后还是超时,可以在等待元素前打印当前页面源码print(drv.page_source),确认页面是否正常加载、是否触发了人机验证拦截。kahoot自带反爬机制,高频请求很容易触发验证,遇到验证需要额外加验证码识别逻辑。

内容的提问来源于stack exchange,提问作者Sola1024

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:09:05