0

I'd like to automate a video-player on a webpage using Selenium in Python.

I cannot locate the interactive parts of the player with driver.find_element_by_... I've decided to try and accomplish this by making browser specific logic that knows how to navigate the page and player via keyboard navigation (count tabs for Chrome, vs Safari, vs Firefox, etc.).

driver.find_element_by_tag_name('body').send_keys(Keys.TAB))

I am able to select each of the controls of the player with tab (play/pause, current position, mute-volume control, full-screen, and additional options) and have had moderate success manipulating the player's controls with ActionChains once selected with TAB navigation

actions = ActionChains(driver)
actions.send_keys(Keys.DOWN) # to reduce volume or 
actions.send_keys(Keys.LEFT) # to rewind playback

An example of something that doesn't work as expected with this method is sending a Key.SPACE to the MUTE button when selected. Instead the space is applied as a page navigation action and scrolls down the page like pressing page down. I'm looking for a method that either makes the controls work as expected when manually navigating the page with a keyboard, ex. space on highlighted object interacts and would normally mute the video in this context, or a workaround that lets me accomplish the same thing. To that end I was thinking if I could get the windows coordinates of the TAB selected object within the video-player and simply perform a click that would at least let me interact with the control.

Also if I'm going about this all the wrong way let me know. Thanks!

1 Answers1

0

What you're really looking for is how to navigate the Shadow DOM. Those are the web elements inside the video player.

I answered how to reach inside the Shadow DOM in an other question, albeit for Java. However the principle is the same.

You can read the whole thing at the link, but the basics are you create a "starting point" WebElement at the Shadow DOM via JavaScript, then all future look-ups reference it:

WebElement button = startingPoint.findElement(By.cssSelector("..."));
MivaScott
  • 1,763
  • 1
  • 12
  • 30