Selenium在单击命令后停止提取选项文本

2024-05-16 06:00:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用Selenium来提取动态加载的内容。内容在http://www.afl.com.au/stats

我正在尝试导航到“球员”选项卡,然后获取所有可用赛季的列表。在“团队”选项卡中执行此操作时,以下代码起作用:

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome(executable_path=r'D:\ChromeDriver\chromedriver.exe')
driver.get('http://www.afl.com.au/stats')

dropdown_menu = Select(driver.find_element_by_xpath('//*[@id="selTeamSeason"]'))

for option in dropdown_menu.options:
    print(option.text)

这给了我一个在“季节”选项卡中所有可用选项的列表。你知道吗

但是,当我首先单击“玩家”选项卡时,我无法获得具有几乎相同代码的相同列表:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome(executable_path=r'D:\ChromeDriver\chromedriver.exe')
driver.get('http://www.afl.com.au/stats')

driver.find_element_by_xpath('//*[@id="stats_tab"]/ul/li[2]').click()

time.sleep(3)

dropdown_menu = Select(driver.find_element_by_xpath('//*[@id="selTeamSeason"]'))

for option in dropdown_menu.options:
    print(option.text)

单击成功执行,我等待内容更新,但是Selenium没有打印所有年份(2001年到2018年),而是打印18个空字符串实例。我完全被难住了。任何帮助都将不胜感激。你知道吗


Tags: fromimporthttp内容wwwstatsdriverselenium
3条回答

不要使用Select,只需找到xpath并获得所有选项标记,如下面所示,经过测试即可工作。你知道吗

element = driver.find_element_by_xpath('//*[@id="selTeamSeason"]')
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
    print(option.text)
  1. 在第一种情况下,定位器(//*[@id="selTeamSeason"])指向团队选项卡的季节下拉列表,页面当时只有一个匹配的节点,因此它适合您。你知道吗
  2. 但是在第二种情况下,对于同一个定位器,有两个匹配的节点可用,在这种情况下,selenium会自动选择第一个节点(在您的情况下,它是一个隐藏的元素)。你知道吗
  3. 因此,尝试构建一个唯一的xpath,它可以在这两个选项卡中工作。你知道吗
  4. 您可以在“球员”选项卡中尝试季节下拉列表的//div[@id='stats-player-stats']//select[@id='selTeamSeason']定位器,在“团队”选项卡中尝试季节下拉列表的//div[@id='stats-team-stats']//select[@id='selTeamSeason']

希望这对你有用

在您的第一次尝试中,以下Locator Strategy对默认的TEAMS选项卡起作用:

dropdown_menu = Select(driver.find_element_by_xpath('//*[@id="selTeamSeason"]'))

因为根据Locator Strategy的第一个匹配是Dropdown本身,这在处理PLAYERS选项卡时不是这样的。在PLAYERS选项卡上列出SeasonsDropdown中可用的所有选项,您可以使用以下代码块:

dropdown_menu = Select(driver.find_element_by_xpath("//div[@id='stats-player-stats']//select[@id='selTeamSeason']"))
for option in dropdown_menu.options:
    print(option.text)

相关问题 更多 >