使用selenium获取当前视频标签URL



我正在尝试使用selenium(带有python绑定)获取当前的html5视频标签URL:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.youtube.com/watch?v=9x6YclsLHN0')
video = driver.find_element_by_tag_name('video')
url = driver.execute_script("return arguments[0].currentSrc;", video)
print url
driver.quit()

问题是url值打印为空。为什么会这样?我该怎么解决?


我怀疑这是因为在初始化视频标签之前执行了脚本并返回了currentSrc值。我试图添加一个显式等待,但仍然打印了一个空字符串:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 5)
video = wait.until(EC.visibility_of_element_located((By.TAG_NAME, 'video')))

这让我觉得我需要异步完成。可能正在收听媒体事件,并等待video开始播放。

我也很确定currentSrc应该工作,因为如果我在控制台中执行代码并手动等待视频启动,我会看到它打印视频currentSrc属性值。


仅供参考,还尝试了java绑定,结果相同,为空字符串:

WebDriver driver = new ChromeDriver();
driver.get("https://www.youtube.com/watch?v=9x6YclsLHN0");
WebElement video = driver.findElement(By.tagName("video"));
JavascriptExecutor js = (JavascriptExecutor) driver;
String url = (String) js.executeScript("return arguments[0].currentSrc;", video);
System.out.println(url);

根据W3视频标签规范:

currentSrcDOM属性最初是空字符串。它的价值由资源选择算法改变。

这解释了问题中描述的行为。这也意味着,为了可靠地获得currentSrc值,我们需要等待,直到媒体资源定义了它

通过execute_async_script()订阅loadstart媒体事件成功:

driver.set_script_timeout(10) 
url = driver.execute_async_script("""
    var video = arguments[0],
        callback = arguments[arguments.length - 1];
    video.addEventListener('loadstart', listener);
    function listener() {
        callback(video.currentSrc);
    };
""", video)
print(url)

最新更新