在Selenium中的空iframe但已填入浏览器(python) [英] Empty iframe in Selenium yet filled in browser (python)

查看:173
本文介绍了在Selenium中的空iframe但已填入浏览器(python)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试控制Spotify的浏览器播放器。所有控件都放在iframe部分中。

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

问题: Selenium WebDriver对象中的iframe是EMPTY。然而,iframe在ACTUAL浏览器中填充了正确的内容。

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

代码示例:

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)


推荐答案

问题在于:

iframe = wrapper.find_element_by_tag_name('iframe')

页面上有多个 iframes ,您对此感兴趣 app-player id:

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

另请注意使用 time.sleep 会使您的自动化代码严重脆弱且通常比需要的速度慢 - 而是使用显式等待等待页面上满足的特定条件。

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.

这篇关于在Selenium中的空iframe但已填入浏览器(python)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆