使用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
相关产品推荐
相关产品推荐

