2015-02-10 134 views
0

我试图让使用硒(与Python绑定)目前HTML5视频标签网址:获取当前视频标签网址与硒

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值的视频标签已被初始化之前。我试图添加一个Explicit Wait,但仍然有打印一个空字符串:

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'))) 

这让我感到我需要做的是asynchronously。可能正在收听media events并等待video开始播放。

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


FYI,还试图用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); 
+0

我试了一下在Java中,这是为我工作。当你可以从视频的src属性中获得同样的东西时,为什么要用'currentSrc'? – 2015-02-10 09:37:40

+0

@VivekSingh谢谢你,我已经更新了这个问题。当我使用'src'时,我仍然得到一个空字符串。请参阅关于从控制台运行它的说明。 – alecxe 2015-02-10 17:42:18

回答

0

按照W3 video tag specification

的currentSrc DOM属性最初是空字符串。其值 由资源选择算法改变。

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

通过execute_async_script()订阅的loadstart media event奏效了:

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)