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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:15:20