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

时间:2018-01-15 09:06:21

标签: python selenium selenium-webdriver selenium-chromedriver

我正在尝试使用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打印了18个空字符串实例,而不是打印所有年份(2001年到2018年)。我彻底难倒了。任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

而不是使用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 :(得分:1)

  1. 在第一种情况下,定位器(//*[@id="selTeamSeason"])指向“团队”选项卡的季节下拉列表,页面当时只有一个匹配的节点,因此它适用于您。
  2. 但在第二种情况下,对于相同的定位器,有2个匹配的节点可用,在这种情况下,selenium自动选择第一个(在您的情况下它是一个隐藏的元素)。
  3. 因此,尝试构建一个唯一的xpath,可以在两个选项卡中工作。
  4. 您可以在“玩家”标签中尝试//div[@id='stats-player-stats']//select[@id='selTeamSeason']定位器用于季节下拉菜单,在“小组”标签中尝试季节下拉列表//div[@id='stats-team-stats']//select[@id='selTeamSeason']
  5. 希望这对你有用

答案 2 :(得分:0)

在您第一次尝试时,以下Locator Strategy使用了默认 TEAMS TAB:

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

由于Locator Strategy的第一场比赛是Dropdown本身,而在处理 PLAYERS TAB时并非如此。在 PLAYERS TAB上列出 Seasons Dropdown中提供的所有选项,您可以使用以下代码块:

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)