Selenium.py无法获取游戏玩家元素文本内容问题求助
问题解决思路与修正代码
核心问题分析
你遇到的空字符串问题,主要来自两个关键错误:
- 异步函数调用方式错误:
find_player是异步函数,但你在同步循环里直接调用,没有用await,导致函数逻辑未正确执行。 - 元素等待条件不匹配:
presence_of_all_elements_located仅确保元素存在于DOM中,不保证元素内容已渲染完成或可见。
另外,部分场景下Selenium的.text方法可能因页面渲染机制无法获取内容,需要改用直接读取DOM属性的方式。
修正步骤与代码
1. 修复异步调用逻辑
把main.py的循环改成异步函数,并用await调用find_player:
# main.py import asyncio async def main(): BOT = Bot() for _ in range(60): if await BOT.find_player("name"): # 找到玩家后的操作 break await asyncio.sleep(1) # 60秒后的操作 asyncio.run(main())
2. 修改元素等待与内容获取方式
更新find_player函数,改用visibility_of_all_elements_located等待元素可见,并通过textContent属性获取内容:
# bot.py from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By class Bot(): async def find_player(self, name): _class = 'fgui-lb-entry-n' # 等待元素可见,确保内容已渲染 names = WebDriverWait(self.driver, 10).until( EC.visibility_of_all_elements_located((By.CLASS_NAME, _class)) ) # 用textContent获取元素文本,替代.text方法 player_names = [elem.get_attribute('textContent').strip() for elem in names] print("Player names found:", player_names) for _name in player_names: print(_name) if _name == name: return True return False
3. 额外排查项:检查是否存在iframe
如果上述修改后仍无效,确认排行榜元素是否位于iframe内:
# 在find_player开头添加iframe切换逻辑(根据实际页面调整选择器) async def find_player(self, name): # 假设iframe的选择器是你实际页面中的标识,比如id或class iframe = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.ID, 'game-iframe')) ) self.driver.switch_to.frame(iframe) # 原有的元素获取逻辑... # 操作完成后切回主文档 self.driver.switch_to.default_content()
验证要点
- 确认
self.driver已正确初始化,且页面已加载到排行榜所在的大厅界面。 - 可通过浏览器开发者工具控制台执行
document.querySelectorAll('.fgui-lb-entry-n').forEach(e => console.log(e.textContent)),验证目标元素是否确实包含玩家名称。
内容的提问来源于stack exchange,提问作者JJ Malovich
相关产品推荐
相关产品推荐

