我在一个discord bot中使用selenium.py,每当我运行这个函数时:
# bot.py
class Bot():
async def find_player(self, name): # if the Bot is in a game
_class = 'fgui-lb-entry-n'
names = WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, _class)))
print("Player names found:", [name.text for name in names])
for _name in names:
print(_name.text)
if _name.text == name:
return True
return False
# main.py
BOT = Bot()
for _ in range(60):
if BOT.find_player("name"):
# do something if true
asyncio.sleep(1)
# after 60 seconds, do something
如果游戏中有 1 名玩家,它总是打印
['']
;如果游戏中有 2 名玩家,它总是打印 ['', '']。
我尝试过切换到XPATH,我已经多次确认类名是正确的。 输出应该是
['TradeBot', 'name']
(TradeBot 是游戏中机器人的名称)
编辑:网站是 bandit.rip 点击创建/加入大厅并创建大厅 该元素将出现在排行榜中
EC.presence_of_all_elements_located()
的问题是它不知道应该有多少个元素。如果它至少找到一个,它就会继续前进。您可以只使用 XPath 并查找包含所需名称的元素,而不是获取所有匹配元素,然后循环遍历所有元素来检查所包含的文本是否等于您要查找的名称。如果找到,则返回 True。如果超时并抛出 TimeoutException,则返回 False。
我会这样重写
# bot.py
class Bot():
async def find_player(self, name): # if the Bot is in a game
try:
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, f"//span[@class='fgui-lb-entry-n'][text()='{name}']")))
return True
except (TimeoutException):
return False