1

I'm trying to control Spotify's browser player. All of the controls are put inside iframe sections.

Problem: The iframes are EMPTY in the Selenium WebDriver object. Yet, the iframes are filled with the correct content in the ACTUAL browser.

Code sample:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

import time

username = 'myusername'
base_url = 'https://play.spotify.com/user/spotifydiscover/playlist/76HML2OQXigkyKopqYkeng'

browser = None

def login():
    global browser
    password = input("Password: ")
    browser = webdriver.Firefox()
    browser.get(base_url)

    browser.find_element_by_id('has-account').click()

    browser.find_element_by_id('login-usr').clear()
    browser.find_element_by_id('login-usr').send_keys(username)

    browser.find_element_by_id('login-pass').clear()
    browser.find_element_by_id('login-pass').send_keys(password)
    browser.find_element_by_id('login-pass').submit()

def next_track():
    global browser
    wrapper = browser.find_element_by_id("section-collection")
    print(wrapper.get_attribute('innerHTML').encode('utf-8'))
    iframe = wrapper.find_element_by_tag_name('iframe')
    print(iframe.get_attribute('innerHTML').encode('utf-8'))
    sub = browser.switch_to_frame(iframe)
    sub.find_element_by_id('next').click()

def test():
    login()
    time.sleep(14) # Adjusted until page is 100% fully loaded
    next_track()
    time.sleep(40)
0

1 Answer 1

2

The problem is here:

iframe = wrapper.find_element_by_tag_name('iframe')

There are multiple iframes on the page and you are interested in the one with app-player id:

browser.switch_to_frame("app-player")
# now use browser.find_element_* to locate elements inside iframe

Also note that using time.sleep makes your automation code seriously fragile and usually slower than needed - instead use Explicit Waits to wait for the specific conditions to be met on a page.

Sign up to request clarification or add additional context in comments.

1 Comment

Ahh thanks! Yeah I had tried a lot of things similar to that, but couldn't get it to work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.