I am writing a simple program to automatically login to my Disney World account. I cannot successfully locate the email address element. I have had success automating other buttons on the Disney World website, but for whatever reason, I can't locate the email address element.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
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
login_url = "https://disneyworld.disney.go.com/login?appRedirect=%2F"
driver = webdriver.Chrome(executable_path=r"MY_CHROMEDRIVER_PATH")
driver.get(login_url)
print("Starting...")
try:
email_input = WebDriverWait(driver, 8).until(
EC.presence_of_element_located((By.XPATH, "")) #See below what I've tried on this line
)
print("Found element, sending keys...")
email_input.send_keys("test")
except:
print("Failed...")
driver.quit()
I have tried the following with no success:
EC.presence_of_element_located((By.XPATH, "//input\[@type='email'\]"))
EC.presence_of_element_located((By.XPATH, "//div\[@id='did-ui-view'\]/div/section/section/form/section/div/div/label/span\[2\]/input"))
EC.presence_of_element_located((By.CSS_SELECTOR, ".ng-valid"))
EC.presence_of_element_located((By.CLASS_NAME, "input-wrapper"))
EC.presence_of_element_located((By.CLASS_NAME, "field-group"))
EC.presence_of_element_located((By.CLASS_NAME, "field field-username-email badgeable"))
I have also tried many other versions of the examples above far too embarrassing to post on here. I have used the inspect element tool and tried everything I could think of. I also downloaded the Selenium IDE Chrome extension to record my keystrokes and find the exact XPATH for the element I was interacting with. I honestly don't know what else to try, which is why I'm posting this question. Any help would be appreciated.
The element with the text as E-Mail Login is within an <iframe>
so you have to:
Induce WebDriverWait for the desired frame to be available and switch to it.
Induce WebDriverWait for the desired element to be clickable.
You can use either of the following Locator Strategies:
Using CSS_SELECTOR:
driver.get('https://disneyworld.disney.go.com/login?appRedirect=%2F')
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#disneyid-iframe")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[aria-label='Username or Email Address']"))).send_keys("TheAtypicalNerd")
Using XPATH:
driver.get('https://disneyworld.disney.go.com/login?appRedirect=%2F')
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='disneyid-iframe']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@aria-label='Username or Email Address']"))).send_keys("TheAtypicalNerd")
Note : You have to add the following imports :
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Browser Snapshot:
You can find a couple of relevant discussions in: