2015-02-10 2 views
0

Я пытаюсь получить текущий html5 видео URL тегов, используя селен (с питоном привязками):Получение текущего 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возвращается до того, как видео тег инициализирован. Я пытался добавить 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, также попытался с ява привязок, такой же результат, пустая строка:

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, он работает для меня. Почему вы собираетесь использовать 'currentSrc', когда вы можете получить то же самое из атрибута src? –

+0

@VivekSingh спасибо, я обновил вопрос. Когда я использую 'src', я все равно получаю пустую строку. См. Также примечание о запуске его с консоли. – alecxe

ответ

0

Согласно W3 video tag specification:

Атрибут currentSrc DOM изначально пустая строка. Его значение изменяется алгоритмом выбора ресурсов.

Это объясняет поведение, описанное в вопросе. Это также означает, что для надежного получения значения currentSrc нам необходимо дождаться, пока медиа-ресурс не определит его.

Подписавшись на loadstart media event через execute_async_script() сделал трюк:

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) 
Смежные вопросы