【问题标题】:Selenium Stops Extracting Option Text After Click CommandSelenium 在单击命令后停止提取选项文本
【发布时间】:2018-01-15 09:06:21
【问题描述】:

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

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

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)

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

【问题讨论】:

    标签: python selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:
    1. 在您的第一种情况下,locator(//*[@id="selTeamSeason"]) 指向 Teams 选项卡的赛季下拉列表,并且页面当时只有一个匹配节点,因此它适合您。
    2. 但在第二种情况下,对于同一个定位器,有 2 个匹配节点可用,在这种情况下 selenium 会自动选择第一个(在您的情况下它是一个隐藏元素)。
    3. 所以尝试构建一个可以在两个选项卡中工作的唯一 xpath。
    4. 您可以尝试使用//div[@id='stats-player-stats']//select[@id='selTeamSeason'] 定位器查找球员标签中的赛季下拉列表,并尝试使用//div[@id='stats-team-stats']//select[@id='selTeamSeason'] 查找团队标签中的赛季下拉列表

    希望这对你有用

    【讨论】:

    • 对于 selenium,获取不可见元素上的文本,selenium 将返回空字符串。这就是为什么当首先点击“玩家”选项卡时,所有赛季都变得不可见,所以 option.text 是空字符串
    【解决方案2】:

    而不是使用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)
    

    【讨论】:

      【解决方案3】:

      在您的第一次尝试中,以下 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多