Получение текущего URL тега видео с селеном

Я пытаюсь получить текущий URL-адрес тега html5 с использованием селена (с привязками python):

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

Что заставляет меня чувствовать, что мне нужно сделать это асинхронно . Возможно прослушивание медиа-событий и ожидание начала воспроизведения video .

Я также уверен, что currentSrc должен работать, потому что если я currentSrc код в консоли и вручную дождитесь начала видео, я вижу, что он печатает 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); 

One Solution collect form web for “Получение текущего URL тега видео с селеном”

Согласно спецификации видеотеку W3 :

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

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

Подписка на событие loadstart через 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) 
Python - лучший язык программирования в мире.