无法使用python硒获得动态元素

时间:2018-10-05 14:47:10

标签: python selenium selenium-webdriver

site,可以流式传输YouTube视频。我想和他们一起获得播放列表。因此,我使用Selenium WebDriver获取了YouTube链接所在的类名称为div的所需元素ytp-title-text

例如,当我使用浏览器控制台查找元素时,它位于此处:

<div class="ytp-title-text"><a class="ytp-title-link yt-uix-sessionlink" target="_blank" data-sessionlink="feature=player-title" href="https://www.youtube.com/watch?v=VyCY62ElJ3g">Fears - Jono McCleery</a><div class="ytp-title-subtext"><a class="ytp-title-channel-name" target="_blank" href=""></a></div></div>

我写了简单的测试脚本:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

driver = webdriver.Firefox()
driver.get('http://awsmtv.com')

try:
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CLASS_NAME, "ytp-title-text"))
    )
finally:
    driver.quit()

但是未找到任何元素,并且引发了超时异常。我不明白,硒需要执行哪些操作才能获得整个页面的源代码。

2 个答案:

答案 0 :(得分:2)

所需的链接被隐藏,并且也位于iframe中。尝试在下面找到它:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("tvPlayer_1"))
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "ytp-title-link")))
    print(element.get_attribute('href'))
finally:
    driver.quit()

答案 1 :(得分:1)

仅看到此元素位于iframe中...您需要先切换到iframe->通过ClassName找到它-> ifame = ...(By.CLASS_NAME, "player")然后再切换到driver.switch_to_frame(iframe),现在应该可以得到想要的元素:)

像这样的XPath定位器(或您的定位器)将起作用-> "//a[@class='ytp-title-link yt-uix-sessionlink']"

然后,您需要通过元素获取youtube视频网址的属性href或歌曲标题的元素text

如果仍然无法正常工作,我建议您获取页面源-html = driver.page_source,它将为您提供页面源并通过一些正则表达式最终获得您想要的信息。