问题描述
我正在尝试使用 Python 和 selenium 编写将登录 Applemusic 的代码。
- 应该打开这个网址:https://music.apple.com/login
到目前为止我的代码:
from time import sleep
import Password
from selenium import webdriver
from selenium.webdriver.support.ui import webdriverwait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
class Applemusic:
def __init__(self,username):
driver = webdriver.Chrome()
driver.get("https://music.apple.com/login")
sleep(20)
for a in username:
webdriverwait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"aid-auth-widget-iFrame")))
webdriverwait(driver,10).until(EC.element_to_be_clickable((By.ID,"account_name_text_field"))).send_keys(a)
sleep (10)
password = "Apple2020"
for i in password:
webdriverwait(driver,"password_text_field"))).send_keys(i)
Applemusic('example@gmail.com')
这是错误:
回溯(最近一次调用最后一次):文件 “/Users/mike/Documents/Python/Applemusic.py”,第 21 行,在 Applemusic('example@gmail.com') 文件“/Users/mike/Documents/Python/Applemusic.py”,第 14 行,init webdriverwait(driver,"aid-auth-widget-iFrame"))) 文件 "/Users/mike/Documents/Python/venv/lib/python3.8/site-packages/selenium/webdriver/support/wait.py",第 80 行,直到 引发 TimeoutException(message,screen,stacktrace) selenium.common.exceptions.TimeoutException: Message:
我不知道我做错了什么。我的 Python 知识很一般,如果有人能帮助我实现我的目标,我将不胜感激。
解决方法
Apple ID 字段位于嵌套的 <iframe>
元素内,因此您必须:
-
诱导WebDriverWait 父 框架可用并切换到它。
-
为子框架诱导WebDriverWait可用并切换到它。
-
诱导 WebDriverWait 使所需的元素可点击。
-
您可以使用以下任一 Locator Strategies:
-
使用
CSS_SELECTOR
:driver.get('https://music.apple.com/login') WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[src^='/includes/commerce/authenticate?product=music']"))) WebDriverWait(driver,"iframe[title^='Sign In with your Apple']"))) WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"input#account_name_text_field"))).send_keys("Tycoonstory@apple.com")
-
使用
XPATH
:driver.get('https://music.apple.com/login') WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@src,'/includes/commerce/authenticate?product=music')]"))) WebDriverWait(driver,"//iframe[starts-with(@title,'Sign In with your Apple')]"))) WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//input[@id='account_name_text_field']"))).send_keys("Tycoonstory@apple.com")
-
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
-
浏览器快照:
参考
您可以在以下位置找到一些相关讨论:
- Ways to deal with #document under iframe
- Switch to an iframe through Selenium and python
- selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium
- selenium in python : NoSuchElementException: Message: no such element: Unable to locate element